以下示例出现在Stroustrup的网站和CPPreference网站上:
struct S {
char a; // location #1
int b:5, // location #2
int c:11,
int :0, // note: :0 is "special"
int d:8; // location #3
struct {int ee:8;} e; // location #4
};
考虑到C++标准提供的内存位置的定义:很清楚:
但是,考虑到上面的定义,对于我来说还不清楚,为什么“d-ee”或“d-e”不是单个位置,而是两个位置。
引用文献:
最佳答案
C++标准(6.7.1 intro.memory)使用极为相似的语言,甚至使用完全相同的示例:
... or a maximal sequence of adjacent bit-fields all having nonzero width ...
[ Example: A class declared as
struct { char a; int b:5, c:11, :0, d:8; struct {int ee:8;} e; }
contains four separate memory locations: The member
a
and bit-fieldsd
ande.ee
are each separate memory locations ...
一个区别是它使用的是“相邻”而不是“连续”。
d
和ee
是否连续? “连续”一词的字面意思是两者之间没有空隙,这似乎表明它在谈论内存布局(它们之间是否有填充?)。但这是定义内存布局的标准的一部分,因此,如果以此定义内容,那将是循环的!这是一个非常差的单词选择,似乎是造成混淆的根源。d
和ee
是否相邻?这肯定是一个更好的词,因为它更明显地是关于代码而不是内存布局,但是我认为您仍然可以解释它,因此在这种情况下答案是是或否。但是,鉴于有一个示例表明它们并非如此,我们必须接受“相邻”作为“定义在同一结构内彼此直接相邻的字段”的简写。
关于c++ - C++内存模型和最大位字段序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62674248/