Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Clang和MSVC为同一个结构报告不同的'sizeof'_C++_Visual C++_Clang_Language Lawyer_Sizeof - Fatal编程技术网

C++ Clang和MSVC为同一个结构报告不同的'sizeof'

C++ Clang和MSVC为同一个结构报告不同的'sizeof',c++,visual-c++,clang,language-lawyer,sizeof,C++,Visual C++,Clang,Language Lawyer,Sizeof,叮当声:3.8.0 MSVC:19.00.24215.1适用于x64 是什么导致了编译器之间的这种奇怪的差异?MSVC报告12个,而Clang报告8个!这里的正确/预期行为是什么?《标准》对此有何评论 enum class CodeCompletionDeclKind {}; struct SwiftSemanticToken { unsigned ByteOffset; unsigned Length : 24; CodeCompletionDeclKind Kind : 6;

叮当声:3.8.0 MSVC:19.00.24215.1适用于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";
}
enum类CodeCompletionDeclKind{};
结构SwiftSemanticToken{
无符号字节偏移量;
无符号长度:24;
codecompletionclkind种类:6种;
bool-IsRef:1;
bool-IsSystem:1;
};
静态断言(sizeof(SwiftSemanticToken)=8,“太大”);
int main()
{

std::cout包含位字段的类对象的大小将由实现定义

:

…类对象中位字段的分配是 已定义实现。位字段的对齐方式为 实现已定义。位字段打包到一些可寻址 分配股[ 注:位字段跨接上的分配单元 有些机器上没有,有些机器上没有。位字段是从右向左分配的 在某些机器上,从左到右在其他机器上。 — 尾注 ]


包含位字段的结构的大小由实现定义。请参阅:Specified Implementation defined“类对象中位字段的实际分配详细信息”中的注释部分@RichardCriten:为什么不写一个答案而不是一个评论?@ChristianHackl在打电话,格式化令人沮丧Tanks,我马上接受你的答案,但首先:Clang在这里做什么使结构大小为8。有没有办法(例如,通过执行无符号字节偏移量:1;)要强制MSVC使其成为8字节结构,我需要这种行为,因为它用于serialization@HBellamy,Clang和GCC显然足够聪明,可以共享8字节的所有位字段成员。另一方面,MSVC并没有将它们打包得那么紧;即使出于我不知道的原因被要求放弃对齐。我只能将它设为9字节。也可以看到,编译器使用的大小根据C++标准是正确的。