一,内存对齐
1,分析需不需要对齐,只需要看到底会不会影响访问次数。
2,内存对齐是一种典型的空间换时间的方法。
3,对齐的原则是: 1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
struct SByte1
{
double d; // 偏移量0~7
char j; // 偏移量8
int a; // 偏移量12~15,由于9不能整除4,故先填充9~11
};
sizeof(SByte1); // = 16
struct SByte2
{
char j; // 偏移量0
double d; // 偏移量8~15,由于1不能整除8,故先填充1~7
int a; // 偏移量16~19
};
sizeof(SByte2); // = 24,为了凑成8的倍数,填充20~23
二,移位运算
1,左移:丢弃最高位,0补最低位,左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移
右移:丢弃低位,符号位补高位。
2,看一段代码,如下。
#include<stdio.h>
int main()
{
int a=31;
int b=0xffffffff;
printf("the first%d\n",0xffffffff>>31);
printf("the second%d\n",b>>31);
printf("the third%d\n",0xffffffff>>a);
printf("%x",b);
return 0;
}
输出结果:the first1
the second-1
the third1
说明:0xffffffff是被当作无符号数看待,int b是有符号数