gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:39:59 24 4
gpt4 key购买 nike

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.

当涉及到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

我猜 sizeof vector 或其他 STL 容器取决于特定环境。

问题1. sizeof如何?在 C/C++ 中实现?它不能是运行时函数。是宏吗? (我在在线教程视频中学到的)。如果它是一个宏,那么 #define 是什么?它看起来像?当 sizeof()执行了吗?

问题2.如果我添加成员方法void f(){}struct S 的定义. sizeof(S<int>)仍然是 4。结构的大小不应该增加吗?

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

最佳答案

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

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

根据问题 3:对于 sizeof(vector<int>)编译器计算 vector<int> 的大小,它实例化为了这样做。如果您因为 vector 而感到困惑可以是可变大小:是的,但是额外的存储是从堆中分配的,因此不会反射(reflect)在 sizeof 的结果中适用于 vector .

关于c++ - sizeof() 运算符在 C++ 中做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24942048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com