位字段大小与预期不一样,原因是什么
Bitfield size is not as expected, why?
为什么这个位字段的大小为4
有没有什么方法可以让它的大小为2(正如下面代码中明显打算的那样),或者这是不可能干净地完成的?
struct S
{
unsigned short x : 15;
bool a : 1;
};
int main() { return sizeof(S); }
使用标准C++是不可能做到的,但可以为结构使用编译器特定的杂注或属性。
在VC++中,它是#pragma pack
同样,为了只获得2的大小,你必须这样做:
#pragma pack(1)
struct s{
unsigned short s1: 15;
unsigned short b1: 1;
};
代码上有#pragma pack
,如下所示:
struct S
{
unsigned short x : 15;
bool a : 1;
};
一个假设的内存布局是:
----------------------
+ 1 | 2 | 3 | 4 | 5 | ..
+ x | a |
+---------------------
因此它占用了3个字节的
将bool a
更改为unsigned short a
,您将得到以下内容:
-------------------------
+ 1 | 2 | 3 | 4 | 5| ..
+ x |a|
-------------------------
它只占用2个字节。
编译器决定,由于第二个short只占用1位,因此可以将结构压缩为2个字节。但是,如果使用了另一种类型的结构成员(例如S
实现中的bool
),编译器会认为,由于类型不同,它实际上无法将1位压缩到unsigned short
中(因为它跨越了类型边界——不幸的是,实现定义了)。因此,sizeof()
得到的是3
字节,而不是2字节。
相关文章:
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- B不接受8作为输入的是什么?C++
- 为什么此指针值不能转换为整数的规则是什么?
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 并行性能不佳的原因是什么?
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 对于指向C++类的不透明C指针,正确的typedef是什么
- boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?
- 为什么左值不能改变自己。左值用户是什么意思?
- 必须具有泛型接口的函数,但必须根据传递的子类(不知道它们是什么!)以不同的行为 - C++
- 我不断收到分段错误,但不知道是什么原因造成的
- 我不知道是什么导致了我的代码中的分段错误
- 不确定是什么导致我的插入过载混乱
- 位字段大小与预期不一样,原因是什么
- 奇怪的循环情况,不知道是什么原因造成的
- 堆栈损坏,不知道是什么原因造成的