首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sizeof(value) vs sizeof(type)?

sizeof(value) vs sizeof(type)?
EN

Stack Overflow用户
提问于 2012-10-10 11:52:49
回答 3查看 4.5K关注 0票数 6

考虑:

代码语言:javascript
复制
double data; 
double array[10]; 
std::vector<int> vec(4, 100); 
MyClass myclass;   

以下内容之间是否有区别:

代码语言:javascript
复制
sizeof(double);
sizeof(double[10]);
sizeof(std::vector<int>);
sizeof(MyClass);

代码语言:javascript
复制
sizeof(data);
sizeof(array);
sizeof(vec);
sizeof(myclass);

这两种语法是不同的还是严格意义上等价的?它们都是在编译时计算的吗?如果不是,那么在运行时评估哪一个?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-10 12:07:55

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

从语法上讲,允许在一种情况下省略括号,但不允许在另一种情况下省略:

代码语言:javascript
复制
double d;

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

在方便的情况下,考虑这样的事情:

代码语言:javascript
复制
float a;

x = sizeof(float);

y = sizeof(a);

例如,如果您有时将afloat更改为double,则还需要将sizeof(float)更改为sizeof(double)以进行匹配。如果您从头到尾都使用sizeof(a),那么当您将afloat更改为double时,您对sizeof的所有使用也将自动更改,无需任何编辑。后者在C中比C++更容易出现问题,例如在调用malloc时:

代码语言:javascript
复制
float *a = malloc(10 * sizeof(float));

代码语言:javascript
复制
float *a = malloc(10 * sizeof(*a));

在第一种情况下,将第一个float更改为double将生成可编译的代码,但会有缓冲区溢出。在第二种情况下,将(唯一) float更改为double可以很好地工作。

票数 22
EN

Stack Overflow用户

发布于 2012-10-10 12:05:00

后者是根据前者来定义的。给定一个表达式,它返回表达式类型的大小。因此,sizeof(vec)转换为sizeof(std::vector<int>)

这两种方法都是在编译时计算的;唯一的运行时sizeof是用C编写的,而不是用C++编写的,具有可变长度的数组。sizeof的操作数未求值,因此没有任何实数,因为表达式本身无论如何都可能生成代码。

我更喜欢使用表达式而不是类型,因为很可能说明类型在某种程度上是多余的。

票数 2
EN

Stack Overflow用户

发布于 2012-10-10 12:21:51

无论何时使用sizeof(<whatever>),都会在编译时对其进行计算。它是sizeof关注的参数的数据类型。

但是,您可以传递值,甚至可以将表达式作为参数传递。但是sizeof函数将只考虑传递的参数的数据类型。

您还可以将表达式作为sizeof(x = x+1);传递。假设x是整型的。在本例中,此sizeof将返回4(就像在我的机器上一样),x的值将保持不变。这是因为sizeof总是在编译时计算。

您提供的两组语法将返回相同的结果,但您不能说它们是等价的。但是,后者是根据前者来定义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12811696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档