Clang和MSVC为同一个结构报告不同的`sizeof`

时间:2017-02-18 10:46:30

标签: c++ visual-c++ clang language-lawyer sizeof

Clang:3.8.0 MSVC:1964.24215.1 for x64

什么可能导致编译器之间的这种奇怪的区别? MSVC报告12,但Clang报告8!这里的正确/预期行为是什么?标准对此有什么要说的吗?

enum class CodeCompletionDeclKind {};

struct SwiftSemanticToken {
  unsigned ByteOffset;
  unsigned Length : 24;
  CodeCompletionDeclKind Kind : 6;
  bool IsRef : 1;
  bool IsSystem : 1;
};
static_assert(sizeof(SwiftSemanticToken) == 8, "Too big");

int main()
{
    std::cout << "Hello, world!\n";
}

1 个答案:

答案 0 :(得分:2)

包含位字段的类对象的大小将是实现定义的。

class.bit/1

  

...类对象中位域的分配是   实现定义。位域的对齐是   实现定义。比特字段被打包成一些可寻址的字段   分配单位。 [注意:比特字段跨越分配单元   一些机器而不是其他机器。位字段从右到左分配   在某些机器上,从左到右在其他机器上。 - 结束说明]