c++ - C++内存模型和最大位字段序列

标签 c++ bit-fields memory-model

以下示例出现在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++标准提供的内存位置的定义:
  • 标量类型的对象;
  • 非零长度的最大连续位字段序列。

  • 很清楚:
  • 'a'是一个位置;
  • 'b-c'是另一个位置;
  • 'd'是新位置的开始。

  • 但是,考虑到上面的定义,对于我来说还不清楚,为什么“d-ee”或“d-e”不是单个位置,而是两个位置。
    引用文献:
  • https://www.stroustrup.com/C++11FAQ.html#memory-model
  • https://en.cppreference.com/w/cpp/language/memory_model
  • 最佳答案

    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-fields d and e.ee are each separate memory locations ...


    一个区别是它使用的是“相邻”而不是“连续”。dee是否连续? “连续”一词的字面意思是两者之间没有空隙,这似乎表明它在谈论内存布局(它们之间是否有填充?)。但这是定义内存布局的标准的一部分,因此,如果以此定义内容,那将是循环的!这是一个非常差的单词选择,似乎是造成混淆的根源。dee是否相邻?这肯定是一个更好的词,因为它更明显地是关于代码而不是内存布局,但是我认为您仍然可以解释它,因此在这种情况下答案是是或否。但是,鉴于有一个示例表明它们并非如此,我们必须接受“相邻”作为“定义在同一结构内彼此直接相邻的字段”的简写。

    关于c++ - C++内存模型和最大位字段序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62674248/

    相关文章:

    c++ - 使用 g++ 从 cpp 文件和静态库创建共享库

    c++ - 结构中位域的值发生变化

    c++ - 原子加载和存储,内存顺序放宽

    c++ - STLR(B) 是否在 ARM64 上提供顺序一致性?

    c++ - 我如何在 linux (debian) 下为 ipod/iphone 编译 c++ 应用程序

    c++ - if/else 语句中的多个条件?

    c++ - 如何将多个包裹一起寄送?

    c++ - 零长度位域的实际使用

    c - 如何使用 GCC 编译器强制执行结构位顺序?

    c++ - C++11 中的数据竞争、UB 和计数器