- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个将C-Functionpointer作为回调的典型函数,例如C-Stdlib qsort()
,任何编译器都可以使用内联优化代码吗?我认为不可能,这是正确的吗?
int cmp(void* pa, void* pb) { /*...*/ }
int func() {
int vec[1000];
qsort(vec, 1000, sizeof(int), &cmp);
}
qsort()
是来自外部库的函数,但是我不认为
LTO在这里也可以,对吗?
my_qsort()
,那么编译器可以内联吗?
int cmp(void* pa, void* pb) { /*...*/ }
void my_qsort(int* vec, int n, int sz, (void*)(void*,void*)) { /* ... */ }
int func() {
int vec[1000];
my_qsort(vec, 1000, sizeof(int), &cmp);
}
最佳答案
不,至少在传统工具链的工作方式上,这是不可能的。传统的操作顺序是完成所有编译,然后完成链接。
要内联生成比较函数,编译器首先必须为内联qsort
本身生成代码(因为qsort
的每个实例通常将使用不同的比较函数)。但是,对于qsort
之类的东西,通常甚至在开始考虑编写代码之前就已将其编译并放置在标准库中。编译代码时,qsort
仅可用作目标文件。
这样,即使有机会做这样的事情,您也需要在链接器而不是编译器中构建内联功能。至少在理论上这是可能的,但绝对是不平凡的-至少在我看来,这几乎肯定比使用源代码要困难得多。它还需要在链接器中复制很多类似编译器的功能,并且可能需要在目标文件中添加大量额外的信息,以使链接器有足够的信息来使用它甚至可以尝试完成此工作。
编辑:也许我应该更详细一些,以免评论链变成一个完整的论点,而不仅仅是措辞。
传统上,链接器从根本上讲是一种非常简单的野兽。它从一个目标文件开始,该文件可以分为四个主要方面:
printf
,它找出在可执行文件中的哪个位置复制了组成
printf
的位,并用该地址填充您的调用)。在最近的合理情况下,可以从共享库中嵌入对共享对象/DLL的引用,而不是从库中复制位,然后将其留给加载程序以在运行时实际查找/加载该文件以提供实际的代码。一个符号。
qsort
和
bsearch
几乎是它将/通常将应用的两个合理的通用功能。对于大多数实际目的,这意味着您将仅出于
qsort
的目的执行优化。
qsort
的实现,该实现不是递归的。这当然是可能的,但也确实很不寻常。
qsort
的情况下(我会承认,这是我亲自测试过的唯一情况)也可能不会。不管是好是坏,
qsort
几乎是这种函数中唯一常见的函数,它对它也没有太大的影响。
关于c++ - C/C++编译器可以以任何方式内联C回调函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5290695/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!