笔试给出的问题没有说明是32位还是16位,也没有说明编译器版本,这让用过gcc,同时又用过vc++的人是有点为难了,面试的时候又有点紧张,所以会把不同编译器的数据类型大小混淆了。
思维还是不够清晰啊!!!!!
面试的时候,我怎么就记得有char是两个字节的编译器呢?????天哪!!!我自己都不好意思了。。
现在整理如下:资料摘自网络
在32位机上,int通常是32位;在16位机上,int通常是16位(由编译器决定,而编译器通常是根据代码运行的目标机来决定)。 所以,int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位。 TC里面 int 就是 2个字节,而VC++里面就是4个字节,gcc里面也是4个字节。 还有long long int 在TC里面是 4 个字节,gcc里面是 8 个字节。
-----------------------------------------------------------------------------------------------------
常用数据类型对应字节数
可用如sizeof(char),sizeof(char*)等得出
char :1个字节
char*(即指针变量): 2个字节(16位编译器) 4个字节(32位编译器) 8个字节(64位编译器)
short int: 2个字节 int/unsigned int: 2个字节(16位编译器) 4个字节(32/64位编译器)
long int: 4个字节
float: 4个字节
double: 8个字节
long/unsigned long: 4个字节(16/32位编译器) 8个字节(64位编译器)
long long: 8个字节
----------------------------------------------------------------------------------------------------------------------------------------------------------
引言:结构对齐的目的是为了加快CPU取数据时的速度,不同的编译器有不同的标准,有关于4字节对齐的,也有关于8字节对齐的,解题时需跟据环境具体分析。
环境:ubuntu10.10 gcc
判断结构大小,只需要注意两点即可:
1.分析结构成员:
小于4字节的结构成员,相对起始地址要在成员大小的倍数上 Char 1 char 类型可以从任何地址开始
Short 2 short 类型需要相对结构起始地址以 2 的倍数处开始 Int 4
大于4 4 对齐 如 double 大小为 8字节,只需按4字节对齐即可
2.整个结构要关于最大的成员大小对齐(不大于4)
如果结构最大的成员是 short 那么结构的大小应是 2 的倍数,(不足时在结构末尾补足) 如果最大成员是 int ,则应是 4 的倍数。
如果是 double ,则是 4 的倍数。 为什么是 4 的倍数?
这是GCC默认的对齐大小,可以修改。
环境:ubuntu10.10 gcc
判断结构大小,只需要注意两点即可:
1.分析结构成员:
小于4字节的结构成员,相对起始地址要在成员大小的倍数上 Char 1 char 类型可以从任何地址开始
Short 2 short 类型需要相对结构起始地址以 2 的倍数处开始 Int 4
大于4 4 对齐 如 double 大小为 8字节,只需按4字节对齐即可
2.整个结构要关于最大的成员大小对齐(不大于4)
如果结构最大的成员是 short 那么结构的大小应是 2 的倍数,(不足时在结构末尾补足) 如果最大成员是 int ,则应是 4 的倍数。
如果是 double ,则是 4 的倍数。 为什么是 4 的倍数?
这是GCC默认的对齐大小,可以修改。
VC下应该默认是8字节。
测试,以下结构的大小是?
struct com {
char c1; 1字节 由下面的对齐知道 占用了 4 字节
测试,以下结构的大小是?
struct com {
char c1; 1字节 由下面的对齐知道 占用了 4 字节
long tt; 关于 4 字节对齐 占用了 4 字节
int c9; 关于 4 字节对齐 占用了 4 字节
short c3; 关于 2 字节对齐 占用了 4 字节
double c4; 关于4字节对齐 占用了 8 字节 }; 4 的倍数, 所以大小共 24 字节。
union 共用体,是一个共用体里面的成员共用一段内存空间,所以共用体的大小就是成员变量最大的那个的字节大小
union com {
//这个例子中,最大的成员变量是double 8个字节,所以union的大小为8
char c1; 1字节 由下面的对齐知道 占用了 4 字节
char c1; 1字节 由下面的对齐知道 占用了 4 字节
long tt; 关于 4 字节对齐 占用了 4 字节
int c9; 关于 4 字节对齐 占用了 4 字节
short c3; 关于 2 字节对齐 占用了 4 字节
double c4; 关于4字节对齐 占用了 8 字节 }; 8字节。
-----------------------------------------------------------------------------------------------
vc++ 8字节对齐环境下
struct inner
{
char c1;
double d;
char c2;
};
这个结构体是8字节对齐,编译器知道是8字节对齐所以给c1分配8个字节,到了d依然是8个字节,到了c2也是8个字节,因此结构体 inner 占24个字节 。而 不是16个字节 。
但是:struct inner2
{
char c1;
char c2;
double d;
}
这个结构体所占的空间却是16个字节。只是因为double d;这条语句的位置变了
编译器在分配内存时依然是8字节对齐方式,给c1首先分8 个字节,到了c2一看他可以接在c1后边,所以c1和c2共同占有8字节,然后再给d分配8字节。所以最终 inner2 将 占16个字节 。
当结构体中包含结构体时,编译器依然将结构体拆开,找到占用内存最大的数据类型,以他所占的空间作为对齐标准,然后在以内部结构体所占的空间作为最小分配内存空间,在按照对齐原则分配内存。
比如:struct inner
{
char c1;
double d;
char c2;
};
struct inner2
{
struct inner t1;
int i;
char c;
};
结构体inner2中还有结构体inner,这时首先找到inner中有double型数据,占用8字节所以,此时将是 8字节对齐 ,然后看struct inner t1; t1需要24字节 ,接下来 i需要4字节 , c需要1字节 ,所以他们两个共分配8字节,加起来共32字节,正好对齐所以最终 inner2将占用32字节 。
{
char c1;
double d;
char c2;
};
这个结构体是8字节对齐,编译器知道是8字节对齐所以给c1分配8个字节,到了d依然是8个字节,到了c2也是8个字节,因此结构体 inner 占24个字节 。而 不是16个字节 。
但是:struct inner2
{
char c1;
char c2;
double d;
}
这个结构体所占的空间却是16个字节。只是因为double d;这条语句的位置变了
编译器在分配内存时依然是8字节对齐方式,给c1首先分8 个字节,到了c2一看他可以接在c1后边,所以c1和c2共同占有8字节,然后再给d分配8字节。所以最终 inner2 将 占16个字节 。
当结构体中包含结构体时,编译器依然将结构体拆开,找到占用内存最大的数据类型,以他所占的空间作为对齐标准,然后在以内部结构体所占的空间作为最小分配内存空间,在按照对齐原则分配内存。
比如:struct inner
{
char c1;
double d;
char c2;
};
struct inner2
{
struct inner t1;
int i;
char c;
};
结构体inner2中还有结构体inner,这时首先找到inner中有double型数据,占用8字节所以,此时将是 8字节对齐 ,然后看struct inner t1; t1需要24字节 ,接下来 i需要4字节 , c需要1字节 ,所以他们两个共分配8字节,加起来共32字节,正好对齐所以最终 inner2将占用32字节 。
---------------------------------------------------------------------------------------------------------------------------------------------
char [ ] ="hello"
实际占用了6个字节。h e l l o \0;