为什么在C函数总是1个字节的大小?(Why is the size of a function in

2019-06-17 23:53发布

当我们使用检查函数的大小sizeof()我们总是得到1个字节 。 这是什么一个字节意味着什么?

Answer 1:

这是一个约束冲突,你的编译器应该诊断它。 如果它编译它尽管如此,你的程序未定义的行为[感谢@Steve杰索普的澄清失效模式,看看@迈克尔伯尔的答案为什么一些编译器允许这个]:从C11,6.5.3.4./ 1:

所述sizeof操作者不得应用于具有功能类型的表达式



Answer 2:

这不是不确定的行为-使用时,C语言标准要求诊断sizeof一个功能标志(函数名),因为它是一个约束违规操作sizeof操作符。

然而,作为一个扩展的C语言,GCC允许在算术void的指针和函数指针,它是由处理的大小进行void或作为一个函数1 。 因此,在sizeof操作符将计算为1void或与海湾合作委员会的功能。 见http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith

你可以使用GCC时发出警告sizeof这些操作数使用-pedantic-Wpointer-arith选项GCC。 或使其与错误-Werror=pointer-arith



Answer 3:

这意味着编译器作者决定的值为1,而不是让恶魔从你的鼻子(确实飞,又是一个不确定使用sizeof这给了我们表达:“C编译器本身必须出具的诊断,如果这是第一次从你的程序所需的诊断由此而来,然后本身可能导致的恶魔从你的鼻子(这,顺便说一句,很可能是记录的诊断消息)飞行只是因为它可能发出进一步违反语法规则或约束进一步的诊断(或,对于这个问题,对于任何理由选择)。” https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

从这个有俚语“鼻魔”不管什么编译器决定响应一个未定义的结构做。 1是该编译器为这种情况下的鼻恶魔。



Answer 4:

正如其他人所指出的,的sizeof()可以采取任何有效的标识符,但不会返回一个有效的(一个诚实的真实有效)导致了函数名。 此外,它完全可以,也可能不导致“魔鬼出鼻子的”综合症。

如果要分析你的程序功能的大小,检查连接映射,可在中间结果目录中找到(一里的东西都被编译成.OBJ /或的.o其中所得图像/可执行文件规定)。 有时有产生一个选项,或者不是这个地图文件...这是编译器/连接依赖性。

如果你想要一个指针的大小的功能,它们都是一样的大小,寻址字对你的cpu大小。



文章来源: Why is the size of a function in C always 1 byte?