在C语言中,
sizeof()
操作符可以在编译时获取其操作数的大小。它不会对操作数进行求值。例如:int ar1[10];
sizeof(ar1) // output 40=10*4
sizeof(ar1[-1]) // output 4
int ar2[ sizeof(ar1) ]; // generate an array of 40 ints.
在处理C++模板类时,我发现了一些奇怪的结果。
template<typename T>
struct S{
T a;
};
sizeof( S<int> ) // output 4
sizeof( S<bool> ) // output 1
sizeof( vector<int> ) // output 24
sizeof( vector<char> ) // output 24
sizeof( vector<bool> ) // output 40
我猜vector
或其他STL容器上的sizeof
取决于特定的环境。
问题1. C/C++中如何实现sizeof
?它不能是运行时函数。它是一个宏吗?(我在在线教程视频中学到的)。如果它是一个宏,它的#define
是什么样子的?sizeof()
何时执行?
问题2. 如果我向struct S
的定义中添加一个成员方法void f(){}
,sizeof(S<int>)
仍然为4。这个结构体的大小不应该增加吗?
问题3. STL容器是模板类。以vector
为例,它有12个成员属性/类型和许多成员方法。很容易解释sizeof( S<int> )
的输出。但我发现很难解释sizeof( vector<int> )
的输出。模板类应该在编译时被实例化,编译器应该完全知道类的大小,即vector<int>
。因此,sizeof()
操作符应该知道。
sizeof
是一个宏? - chris