Sizeof (struct)返回意外值
sizeof(struct) returns unexpected value
这应该很简单,但我不知道在哪里寻找问题:
我有一个结构体:struct region
{
public:
long long int x;
long long int y;
long long int width;
long long int height;
unsigned char scale;
};
当我做sizeof(region)
时,当我期望33时,它给了我40。
任何想法?
填充结构体以适应8字节的边界。所以它实际上占用了40字节的内存——sizeof返回了正确的值。
如果您希望它只占用33个字节,那么指定packed
属性:
struct region
{
public:
long long int x;
long long int y;
long long int width;
long long int height;
unsigned char scale;
} __attribute__ ((packed));
long long int
值为8字节。scale
只有1个字节,但是为了对齐而填充,所以它也有效地占用了8个字节。5*8 = 40
.
如前所述,结构体是为对齐而填充的,这种填充不仅取决于成员的类型,还取决于定义它们的成员的顺序。
例如,考虑下面定义的A
和B
这两个结构体。这两个结构体在成员和类型方面是相同的;唯一的区别是定义成员的顺序不同:
struct A
{
int i;
int j;
char c;
char d;
};
struct B
{
int i;
char c;
int j;
char d;
};
sizeof(A)
是否等于sizeof(B)
仅仅因为它们具有相同类型的相同数量的成员?不。试着打印每个
cout << "sizeof(A) = "<< sizeof(A) << endl;
cout << "sizeof(B) = "<< sizeof(B) << endl;
输出:sizeof(A) = 12
sizeof(B) = 16
惊讶吗?查看自己的输出:http://ideone.com/yCX4S
相关文章:
- 三元运算符在返回语句中给出意外的结果
- QT 和 JIRA Rest API: /rest/api/2/issue/createmeta 意外返回韩语的 iss
- 为什么这会返回意外值?
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- C++ 三角函数返回意外值
- 裸__declspec上的 memcpy 返回意外的字节
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 在C 中读取二进制文件会返回意外值
- 在 winapi 回调函数上返回 FALSE 时出现意外行为(循环被跳过?
- 从函数的返回值将元素C++存储到 std::vector 中时出现意外结果
- OpenCL - 内核方法返回意外结果
- system() 返回错误语法错误:"("意外
- 从指针返回对象时出现意外的析构函数调用
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- C :Bool方法在COUT语句之后返回意外数字
- 文件设置正确,但eof()和peek()意外地从新流返回了错误的值
- 用户定义的功能的意外返回值
- VS2012 std::函数运算符 bool 意外返回 true
- GCC优化导致意外返回值
- 意外返回主函数和排序字符串函数