什么是sizeof()运算符在C++中做什么

Pen*_*ang 2 c++ stl sizeof

sizeof()用C经营者给其操作数在编译时的大小.它不评估其操作数.例如,

int ar1[10];
sizeof(ar1) // output 40=10*4
sizeof(ar1[-1]) // output 4
int ar2[ sizeof(ar1) ]; // generate an array of 40 ints.
Run Code Online (Sandbox Code Playgroud)

谈到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
Run Code Online (Sandbox Code Playgroud)

我猜sizeofon vector或其他STL容器取决于特定的环境.

问题1.如何sizeof在C/C++中实现?它不能是运行时功能.这是一个宏吗?(我在在线教程vedio中学到的东西).如果它是一个宏,#define它看起来像什么?什么时候sizeof()执行?

问题2.如果我将成员方法添加void f(){}到定义中struct S.在sizeof(S<int>)仍然4.如果没有结构的大小会增加吗?

问题3. STL容器是模板类.就拿vector例如,它有12个成员的属性/类型的许多成员方法?很容易解释输出sizeof( S<int> ).但我发现很难解释输出sizeof( vector<int> ).模板类应该在编译时实例化,编译器应该完全了解类的大小,即vector<int>.sizeof()操作员应该知道.

Ale*_*ler 5

根据问题1:sizeof由编译器实现和评估.它不是宏,它总是提供编译时结果.从概念上讲,您可以想象编译器会用sizeof数字替换每个编译器.

根据问题2:sizeof计算一个实例S占用的存储量.方法不采用每实例存储,只采用字段(因为它们每个实例存在一次).但是,某个方法会在某处占用静态存储空间来保存该函数的机器代码.

根据问题3:sizeof(vector<int>)编译器计算vector<int>其实例化的大小,以便这样做.如果你感到困惑,因为a vector可以是可变大小:这是真的,但额外的存储是从堆中分配的,因此不会反映在sizeof应用于a 的结果中vector.

  • `std :: vector <bool>`是一个显式调用的特化,它可能比法向量使用更多的空间. (3认同)

Bri*_*ian 5

  1. sizeof不是宏.它是一个内置运算符并产生一个常量表达式,因此您可以想象编译器只是在编译时用一个文字替换它,该文字的值是对象或类操作数的大小.

  2. 函数不会占用对象内部的空间.函数的代码不存储在对象内.

  3. 容器的大小,例如std::vector<int>向量成员占用的内存量,加上一些实现定义的填充.它不包含向量通过保持指针"拥有"的任何内存.(注意,向量的元素不是成员---当我说成员时我指的是在std::vector类的定义中声明的成员.)因此它与向量中的元素数量无关.

  • @AndreyChernukha No.如果函数不是虚函数,那么编译器可以在编译时确定它的地址; 调用成员函数不需要检查对象.如果函数是虚函数,通常只有一个*single*指针添加到对象,它指向存储在其他地方的表,它为对象的类提供*all*虚函数的地址. (2认同)