代码:
int main()
{
extern int a;
int b;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
}
输出:
4
4
如果我们只声明一个变量,它不应该为该变量分配内存(?)。 那么编译器如何不为
提供错误 cout<<sizeof(a)<<endl;
或为什么程序没有崩溃?
答案 0 :(得分:4)
sizeof
不需要计算传递给它的表达式,只需要计算它的类型。外部定义extern int a
足以确定类型,因此sizeof
成功。
此外,由于sizeof
内的表达式未被评估,程序链接没有错误。
答案 1 :(得分:3)
sizeof
在编译时解析。所有编译器需要的是一个完整类型的声明 - 不需要为对象分配存储空间。
由于sizeof
表达式在编译时被解析,因此无法检查对象是否实际上是在另一个编译单元中定义的。如果我们想要这个检查我们无法在编译时评估sizeof
(我们必须将它推迟到链接时间),并且没有充分的理由来解决这个问题。
答案 2 :(得分:2)
编译器知道int
的大小为4,并且在编译之后没有任何东西可以给int
另一个大小。因此,sizeof(a)
变为sizeof(int)
,变为4
。
答案 3 :(得分:2)
sizeof()不是一个函数,它是一个语言关键字,它解析为编译时常量。
所以 - 您没有访问或使用“a”,而是向编译器询问有关您提供的有关“a”的信息之一的问题。
cout << sizeof( a ) << endl:
实际上是
cout << sizeof decltype(a) << endl;
实际上是
cout << sizeof int << endl;
实际上是
cout << 4 << endl;
您可以通过查看装配输出来验证这一点。在Linux下,使用GCC或Clang,
c++ -Wall -o test.S -S test.cpp
将生成程序集文件供您检查。
答案 4 :(得分:1)
因为它获得的是变量类型的大小而不是实际使用的内存大小(应该是相同的)。
int main () {
int a = 2;
std::cout << sizeof ((char) a) << std::endl; // Outputs 1
return 0;
}
答案 5 :(得分:1)
使用extern int a
,您只是告诉编译器某处(应该是)a
类型为int
的变量。但是,您唯一要做的就是将sizeof
应用于它。现在,编译器不需要访问a
来了解它的大小:由于您告诉编译器a
类型为int
,它已经知道它的大小:所有{{1} } s的大小相同。
为什么编译器没有给出错误:int
实体缺少定义只会在实际使用该实体时出错。由于extern
不使用它,但只告诉您大小,因此不会出现编译错误。