作者在 2011-03-04 12:36:12 发布以下内容
自然对界
struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如 int、long、float 等)的变量,也可以是
一些复合数据类型(如 array、struct、union 等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。
struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如 int、long、float 等)的变量,也可以是
一些复合数据类型(如 array、struct、union 等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。
各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size 最大的成员对齐。
例如:
struct naturalalign
{
char a;
short b;
char c;
};
在上述结构体中,size最大的是 short,其长度为 2 字节,因而结构体中的 char 成员 a、c 都以2 为单位对齐,
sizeof(naturalalign)的结果等于 6;
如果改为:
struct naturalalign
{
char a;
int b;
char c;
};
其结果显然为 12。(以上为转载部分)
自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size 最大的成员对齐。
例如:
struct naturalalign
{
char a;
short b;
char c;
};
在上述结构体中,size最大的是 short,其长度为 2 字节,因而结构体中的 char 成员 a、c 都以2 为单位对齐,
sizeof(naturalalign)的结果等于 6;
如果改为:
struct naturalalign
{
char a;
int b;
char c;
};
其结果显然为 12。(以上为转载部分)
我写的程序验证:
#include <stdio.h>
#include <stdlib.h>
struct stu
{
char a;
char b;
int c;
char d;
} stu={'a','b',123,'d'};
int main(int argc, char *argv[])
{
char *p=&stu.a;
printf("%d\n",sizeof(struct stu));
printf("%c %c %d %c\n",*p,*(p+1),*(p+4),*(p+8));
system("pause");
return 0;
}
#include <stdlib.h>
struct stu
{
char a;
char b;
int c;
char d;
} stu={'a','b',123,'d'};
int main(int argc, char *argv[])
{
char *p=&stu.a;
printf("%d\n",sizeof(struct stu));
printf("%c %c %d %c\n",*p,*(p+1),*(p+4),*(p+8));
system("pause");
return 0;
}
输出为:12
a b 123 d