Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译器在不同的平台上实现C内联函数有什么不同吗_C_Compiler Construction - Fatal编程技术网

编译器在不同的平台上实现C内联函数有什么不同吗

编译器在不同的平台上实现C内联函数有什么不同吗,c,compiler-construction,C,Compiler Construction,有人告诉我,不同平台(例如Mips与x86)中C内联函数的实现略有不同。例如,其中一个(Mips或x86)的内联函数仍然分配堆栈,因此效率不高。这是真的吗?有什么区别?谢谢当您将每个函数声明为内联时,并不保证每个函数都是内联的(这只是对编译器的一个建议)。因此,对于任何体系结构,未内联的函数都将被视为普通函数,因此在调用它们时,堆栈中的push&pop(与任何普通的非内联函数一样) 这在很大程度上取决于编译器的配置方式。例如,有如下标志: -finline函数 考虑内联的所有函数,即使它们没有声

有人告诉我,不同平台(例如Mips与x86)中C内联函数的实现略有不同。例如,其中一个(Mips或x86)的内联函数仍然分配堆栈,因此效率不高。这是真的吗?有什么区别?谢谢

当您将每个函数声明为内联时,并不保证每个函数都是内联的(这只是对编译器的一个建议)。因此,对于任何体系结构,未内联的函数都将被视为普通函数,因此在调用它们时,堆栈中的push&pop(与任何普通的非内联函数一样)

这在很大程度上取决于编译器的配置方式。例如,有如下标志:

-finline函数
考虑内联的所有函数,即使它们没有声明为内联。编译器试探性地决定哪些函数值得以这种方式集成

-finline limit=n
默认情况下,GCC限制可以内联的函数的大小。此标志允许粗略控制此限制。n是可以以伪指令数内联的函数的大小

--param name=value

在某些地方,GCC使用各种常量来控制所完成的优化量。例如,GCC不内联包含超过一定数量指令的函数。您可以使用--param选项在命令行上控制其中一些常量。

编译器决定如何实现特定优化不是由标准设置的,因此您可以预期同一平台上不同编译器之间以及不同平台上相同编译器之间的差异。我认为不可能给出一个“明确”的答案。我问你为什么要问?通常,“微观优化”是比它值得付出更多的努力。你有没有这样的例子?我需要实现set/get方法来访问结构的字段,就像我们在OO编程中所做的那样。考虑到效率,内联函数是我最后的选择。但有人告诉我,内联函数在x86平台上可能效率不高。我不确定这是不是真的,我想知道所有的区别是什么…而且,代码生成的细节由单个编译器决定,而不是由给定平台上的所有编译器共享。。。我严重怀疑是否有人对每一个可用的编译器进行了测试,并构建了一个给出“所有差异”的表。绝对语句本质上总是错误的,包括这一条——如果这对您来说真的很重要,请使用您感兴趣的特定代码在您感兴趣的特定平台上测试您感兴趣的编译器。我理解这是不保证的。但是如果编译器决定内联它,那么跨平台的实现会有所不同吗?检查我上面提到的gcc链接,规则是由编译器而不是硬件/架构制定的。显然,底层机器资源在决定对内联的支持级别方面起到了一定的作用。例如,支持最大N级嵌套内联函数等。总而言之,这主要是您的编译器设置和可用硬件资源,而不是您的平台类型。@Floris:我将此作为补充!:)