考虑:
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);这两种语法是不同的还是严格意义上等价的?它们都是在编译时计算的吗?如果不是,那么在运行时评估哪一个?
发布于 2012-10-10 12:07:55
唯一的区别在于语法和便利性。
从语法上讲,允许在一种情况下省略括号,但不允许在另一种情况下省略:
double d;
sizeof(double); // compiles
sizeof(d); // compiles
sizeof d; // compiles
sizeof double; // does NOT compile在方便的情况下,考虑这样的事情:
float a;
x = sizeof(float);
y = sizeof(a);例如,如果您有时将a从float更改为double,则还需要将sizeof(float)更改为sizeof(double)以进行匹配。如果您从头到尾都使用sizeof(a),那么当您将a从float更改为double时,您对sizeof的所有使用也将自动更改,无需任何编辑。后者在C中比C++更容易出现问题,例如在调用malloc时:
float *a = malloc(10 * sizeof(float));与
float *a = malloc(10 * sizeof(*a));在第一种情况下,将第一个float更改为double将生成可编译的代码,但会有缓冲区溢出。在第二种情况下,将(唯一) float更改为double可以很好地工作。
发布于 2012-10-10 12:05:00
后者是根据前者来定义的。给定一个表达式,它返回表达式类型的大小。因此,sizeof(vec)转换为sizeof(std::vector<int>)。
这两种方法都是在编译时计算的;唯一的运行时sizeof是用C编写的,而不是用C++编写的,具有可变长度的数组。sizeof的操作数未求值,因此没有任何实数,因为表达式本身无论如何都可能生成代码。
我更喜欢使用表达式而不是类型,因为很可能说明类型在某种程度上是多余的。
发布于 2012-10-10 12:21:51
无论何时使用sizeof(<whatever>),都会在编译时对其进行计算。它是sizeof关注的参数的数据类型。
但是,您可以传递值,甚至可以将表达式作为参数传递。但是sizeof函数将只考虑传递的参数的数据类型。
您还可以将表达式作为sizeof(x = x+1);传递。假设x是整型的。在本例中,此sizeof将返回4(就像在我的机器上一样),x的值将保持不变。这是因为sizeof总是在编译时计算。
您提供的两组语法将返回相同的结果,但您不能说它们是等价的。但是,后者是根据前者来定义的。
https://stackoverflow.com/questions/12811696
复制相似问题