C++内存对齐的疑问

leechiyang 2009-03-19 11:31:36

struct test
{
int a;
char b;
} ;

sizeof(test)是8,

struct test
{
int a;
char b;
} ;
为什么sizeof(test)是16而不是12呢?
VC2003环境。

...全文
108 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
leechiyang 2009-03-19
  • 打赏
  • 举报
回复
什么情况下按4字节对齐,什么时候按8字节对齐?
是不是只要类里面出现了double ,就默认按8字节对齐呢?
jyh_baoding 2009-03-19
  • 打赏
  • 举报
回复
是32为机和64位机的区别,在加上9楼说的
Sharp1070329152 2009-03-19
  • 打赏
  • 举报
回复
同意楼上的
oyljerry 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 leechiyang 的回复:]
引用 7 楼 cnzdgs 的回复:
贴错代码了吧?

是啊

struct test
{
double a;
char b;
} ;
sizeof(test)是16
[/Quote]
double 8字节,后面的char 1个字节,同时对齐,填满8个字节
总共16个字节
leechiyang 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
贴错代码了吧?
[/Quote]
是啊

struct test
{
double a;
char b;
} ;
sizeof(test)是16
cnzdgs 2009-03-19
  • 打赏
  • 举报
回复
贴错代码了吧?
allright1199 2009-03-19
  • 打赏
  • 举报
回复
结构体里的数据自动按照最长数据类型来对齐,
16?难道是64位计算机
smaltdd 2009-03-19
  • 打赏
  • 举报
回复
所谓对齐,就是地址必须能整除一个整数,这个就是对齐参数(alignment value)。合法的取值范围是1、2、4、6、16、……、8192。

怎样对齐呢?编译器帮你搞定。

怎样设置编译器的对齐方式呢?用#pragma pack( n )和__declspec(align(#))。

用MSDN的话一言以蔽之:

“The alignment of a member (except the first one) will be on a boundary that is either a multiple of n or a multiple of the size of the member, whichever is smaller.”

翻译成中文,也就是:

“结构体中的数据成员,除了第一个是始终放在最开始的地方,其它数据成员的地址必须是它本身大小或对齐参数两者中较小的一个的倍数。”


我的理解,如果没有使用#pragma pack( n )
编译器会取结构中大于1的类型大小的整数倍取长对其

对于你多列举的结构:应该是sizeof(int)的整数倍
Tinary3v0 2009-03-19
  • 打赏
  • 举报
回复
C++有一个按多少位对齐的问题

楼主试试在定义结构前 增加类似#pragma pack(1)
这样的代码 也就强制它按照某个固定字节数对齐 #pragma pack(1) 就是一字节对齐
dch4890164 2009-03-19
  • 打赏
  • 举报
回复
哥们你太强了
我整了半天也没有整出16来
最多整出来8了,12都没有弄出来
weidong0210 2009-03-19
  • 打赏
  • 举报
回复
为什么呢?
healer_kx 2009-03-19
  • 打赏
  • 举报
回复
我也很质疑。。。 。。。
写什么呢?
Tinary3v0 2009-03-19
  • 打赏
  • 举报
回复
纠正一下
struct test   //12个字节
{
double a; //8
char b; //1
char c; //1 //为了四字节对齐 后面空出来两位
} ;

Tinary3v0 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 leechiyang 的回复:]
什么情况下按4字节对齐,什么时候按8字节对齐?
是不是只要类里面出现了double ,就默认按8字节对齐呢?
[/Quote]
怎么对齐跟你使用内存的情况有关系 比如 你希望一个字节一个字节的来划分你的数据 那么你就需要使用1字节对齐

我就遇到过这种情况 一个以1字节对齐的文件 我用四字节的方式存取 结果就大了一点 读数据的时候也出现错误。

什么时候按照4字节对齐 什么时候按照8字节对齐 跟你数据结构中变量类型的先后顺序有关系

四字节对齐的情况下
#pragma  pack( 4 )

struct test //12个字节
{
double a; //8
char b; //2
char c; //2
} ;

struct test1 //16个字节
{
char b; //4
double a; //8
char c; //4
}

应该占用的字节是不同的 尽管你声明的结构中变量类型什么都相同 只是因为顺序不同就造成了 结构体占用不同。

飞天舞 2009-03-19
  • 打赏
  • 举报
回复
到project->properties下:c/c++选项下。
code generation ->struct member alignment下选择结构体结构属性
leechiyang 2009-03-19
  • 打赏
  • 举报
回复
明白怎么回事了。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧