C / C ++中sizeof()的机制是什么?
看来sizeof不是真正的function吗?
例如,如果你这样写:
int i=0; printf("%d\n", sizeof(++i)); printf("%d\n", i);
你可能得到如下输出:
4 0
当你深入研究汇编代码时,你会发现这样的:
movl $4, %esi leaq LC0(%rip), %rdi xorl %eax, %eax call _printf
因此,编译器直接将常量“4”作为printf的参数添加调用它。 那尺寸做什么呢?
你知道,有标准文件的原因(3.8MB PDF) ; C99,第6.5.3.4节,§2:
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 大小由操作数的类型确定。 结果是整数。 如果操作数的类型是可变长度数组类型,则计算操作数; 否则, 不评估操作数,结果是整数常量 。
在回应ibread的评论时,这里是C99可变长度数组的一个例子:
#include size_t sizeof_int_vla(size_t count) { int foo[count]; return sizeof foo; } int main(void) { printf("%u", (unsigned)sizeof_int_vla(3)); }
foo
的大小在编译时不再是已知的,必须在运行时确定。 生成的程序集看起来很奇怪,所以不要问我实现细节……
sizeof
是一个运算符,而不是一个函数。
它通常被评估为编译时间 – 例外情况是它在C99样式的可变长度数组上使用。
您的示例是评估sizeof(int)
,这当然在编译时已知,因此代码将替换为常量,因此++
在运行时不存在以执行。
int i=0; cout << sizeof(++i) << endl; cout << i << endl;
值得注意的是,由于它是一个运算符,因此可以在没有括号的情况下使用它们:
int myVal; cout << sizeof myVal << endl; cout << sizeof(myVal) << endl;
是等价的。
Sizeof分析传递的表达式以查找其类型。 然后它返回类型的大小。
因为类型的大小在编译时始终是已知的,所以它作为常量放入机器代码中。
在编译时将它替换为常量(在您的情况下为4)。 因为在您的平台上保存int需要4个字节。
并且你的代码不会编译,而不是给你任何输出;-)因为sizoef
😉
返回类型的大小是在编译时计算的,没有运行时开销
在C ++中, sizeof()
计算其中表达式类型的大小,并在编译期间用常量替换整个“ sizeof()
函数调用”。
在程序执行期间永远不会评估sizeof()
的表达式。 它甚至可能不是类型名称。 检查这些例子:
struct X { int i; double j;}; int call_to_undefined_function(); sizeof(10/0); sizeof( ((struct X*)NULL)->j ); sizeof( call_to_undefined_function() + 100 ); sizeof( call_to_undefined_function() + 100.0 ); sizeof( double() / int() );
它究竟是做什么的:直接将常量“变量/常量/类型/等的大小”放入代码中
sizeof()返回作为参数传递给它的任何内容的大小(以字节为单位)。 在32位体系结构中,sizeof(int)将返回4,而sizeof(char)将返回1。
你自己说:’sizeof’不是一个function。 它是一个具有特殊语法和语义的内置运算符(请参阅前面的响应)。 为了更好地记住它不是一个函数,你可能想要摆脱使用多余括号的习惯,并且更喜欢使用带有表达式的“无括号”’sizeof’,如下例所示
printf("%d\n", sizeof ++i);
这与原始版本完全相同。