for*_*818 18 c++ sizeof language-lawyer
假设我有两个类,它们的内存布局应该完全相同:
struct A {
int x;
int y;
};
/* possibly more code */
struct B {
int a;
int b;
};
Run Code Online (Sandbox Code Playgroud)
标准中是否有什么可以保证我可以安全地使用static_assert(sizeof(A) == sizeof(B))
?
作为较弱的变体,请考虑
struct C {
int a;
};
static_assert( sizeof(A) >= sizeof(C) ); // can this ever fail?
static_assert( sizeof(A) > sizeof(C) ); // can this ever fail?
Run Code Online (Sandbox Code Playgroud)
这个问题引发了这个问题。我天真地希望不会有任何断言失败,但是可以保证吗?
标准中的任何内容都不会禁止这样的实现:识别曾经用作联合部分的所有结构,并在未以这种方式使用的任何结构的每个元素之后添加随机数量的填充。另一方面,如果实现可以处理标签的数量,则没有什么可以阻止实现以任意方式运行,也没有什么可以阻止实现施加一个限制。
所有这些事情都属于标准允许一致性实现执行的事情类别,但即使标准允许,质量实现通常也应该避免执行。该标准没有努力禁止实现做愚蠢的事情,也没有猜测某些专门的实现是否有充分的理由以非典型方式处理某些内容。相反,它期望编译器编写者将尽力满足客户的需求,无论标准是否要求他们这样做。
归档时间: |
|
查看次数: |
501 次 |
最近记录: |