c++ - sizeof(值)与 sizeof(类型)?

标签 c++ runtime sizeof compile-time

考虑:

double data; 
double array[10]; 
std::vector<int> vec(4, 100); 
MyClass myclass;   

有区别吗:

sizeof(double);
sizeof(double[10]);
sizeof(std::vector<int>);
sizeof(MyClass);

sizeof(data);
sizeof(array);
sizeof(vec);
sizeof(myclass);

这两种语法是不同的还是完全等同的?所有这些都在编译时评估吗?如果不是,哪个在运行时评估?

最佳答案

唯一的区别在于语法和便利性。

从句法上讲,您可以在一种情况下省略括号,但在另一种情况下则不能:

double d;

sizeof(double); // compiles
sizeof(d);      // compiles
sizeof d;       // compiles
sizeof double;  // does NOT compile

就便利性而言,考虑如下内容:

float a;

x = sizeof(float);

y = sizeof(a);

例如,如果您有时最终将 afloat 更改为 double,您还需要更改 sizeof(float)sizeof(double) 来匹配。如果您始终使用 sizeof(a),当您将 afloat 更改为 double 时,您所有的sizeof 的使用也会自动更改,无需任何编辑。后者在 C 中比在 C++ 中更常见,例如调用 malloc 时:

float *a = malloc(10 * sizeof(float));

对比

float *a = malloc(10 * sizeof(*a));

在第一种情况下,将第一个 float 更改为 double 将生成可编译但缓冲区溢出的代码。在第二种情况下,将(仅)float 更改为 double 效果很好。

关于c++ - sizeof(值)与 sizeof(类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12811696/

相关文章:

c++ - cout/cerr wrapper ostream 以最小的努力

c - 如果 sizeof(long) 在我的机器上是 4 个字节,我可以推断 sizeof(long long) 将是 8 个字节吗?

c++ - C++ 中的 sizeof 是在编译时还是运行时评估的?

python - Jamroot (boost-bjam) 与共享库链接

c++ - OpenGL 不绘制任何东西

c++ - VC++ 2008下qtwinmigrate + qtpropertybrowser的编译组合

python - 提高加权移动平均过滤函数的运行时间?

.net - 在 Visual Studio 中编译不需要安装 .net 的代码 C++

iphone - 为什么我的程序在 objc_msgSend() 期间在 _class_isInitialized() 中接收到 EXC_BAD_ACCESS?

c - 在 C 编程中将值从字符数组传输到整数数组