【发布时间】:2014-09-16 12:00:53
【问题描述】:
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
我猜向量或其他 STL 容器上的 sizeof 取决于特定环境。
问题1.sizeof在C/C++中是如何实现的?它不能是运行时函数。是宏吗? (我在在线教程视频中学到的)。如果是宏,它的#define 是什么样的? sizeof()什么时候执行?
问题2。如果我在struct S的定义中添加一个成员方法void f(){}。 sizeof(S<int>) 还是 4,不应该增加 struct 的大小吗?
问题 3。 STL 容器是模板类。以vector 为例,它有12 个成员属性/类型和许多成员方法? sizeof( S<int> ) 的输出很容易解释。但我发现很难解释sizeof( vector<int> ) 的输出。模板类应在编译时实例化,编译器应完全了解类的大小,即vector<int>。 sizeof()运营商应该知道。
【问题讨论】:
-
你一次问了太多问题。问题 2 在这里回答:stackoverflow.com/questions/8058213/…
-
sizeof 是 C/C++ 中的关键字。我还没有看到宏的名称成为关键字。也许 sizeof 不是宏。
-
@Slava 谢谢。老实说,我不会在我的代码中以那些奇怪的方式使用 sizeof。只是觉得对 sizeof 的行为太无知了。
-
哪个视频说
sizeof是宏? -
@chris 在edu.51cto.com/lesson/id-30061.html的中文视频中有解释