能力值:
( LV12,RANK:230 )
|
-
-
2 楼
字节对齐啊
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
字节对齐
|
能力值:
( LV12,RANK:250 )
|
-
-
4 楼
align,结构体内存对齐机制。默认情况下变量以CPU的一个字长对齐,目前多数是32位CPU,所以结构体变量都以DWORD对齐。于是:
typedef struct
{
char ss[11]; //占用3个dword即12byte,最后一个byte无用被用以后继数据对齐
DWORD one;
}ok_i;
而:
typedef struct
{
char ss[11]; //同上
DWORD one;
char one; //这个变量占用一个dword空间即4byte
}ok_i;
但是一般编译器对同类型数据有合并优化,如果你定义这样的结构:
typedef struct
{
char ss[11];
char on;
DWORD one;
}ok_i;
那么,你应该能得到想要的结果sizeof(ok_i) == 16。
另外,如果你非得要自己那么写结构体,又希望sizeof()如你所愿。可以这么写:
#pragma pack (push,1) //强制1byte对齐
typedef struct
{
char ss[11];
DWORD one;
}ok_i;
#pragma pack (pop) //恢复默认对齐
sizeof(ok_i) == 15 , as your wish.
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
[QUOTE=triones;1179705]align,结构体内存对齐机制。默认情况下变量以CPU的一个字长对齐,目前多数是32位CPU,所以结构体变量都以DWORD对齐。于是:
typedef struct
{
char ss[11]; //占用3个dword即12byte,最后一个byte无用被用以后继数据对齐
DWORD ...[/QUOTE]
这样貌似不好吧.这种潜规则,导致字节计算不准确.我怎么知道什么时候填空字节呀!?
|
能力值:
( LV12,RANK:250 )
|
-
-
6 楼
基本所有编译器都是这个规则,这个规则的制定是为了提高CPU的数据访问速度,利大于弊。
你要不就接受它,要不就在自己的代码写上#pragma pack (push,1),要不就设置编译选项:C/C++>>>代码生成>>>结构成员对齐(1字节 /Zp1)
注意强制对齐可能会影响你的程序执行效率。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
那为啥这个结构没见填充字节呢?我调试看sizeof结果也就是32。没见填充字节呀,按说每个变量都不够整字长,应该填充很多呀!?
typedef struct
{
char nn[11];
char ss[15];
char pp[5];
char t;
}Item;
|
能力值:
( LV12,RANK:250 )
|
-
-
8 楼
注意我之前有提醒过你:
[QUOTE=triones;1179705]
但是一般编译器对同类型数据有合并优化,如果你定义这样的结构:
typedef struct
{
char ss[11];
char on;
DWORD one;
}ok_i;
那么,你应该能得到想要的结果sizeof(ok_i) == 16。
[/QUOTE]
编译器对连续的、同类型数据,有合并优化
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
不是按每个变量给你对齐的,
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
你那几个char总共32字节,而且连续的,4的倍数,不用对齐了。
|
|
|