sizeof pointer and struct
#include <stdlib.h> struct { short a1; short a2; short a3; }A; struct { long a1; short a2; }B; int main() { char *ss1 = "0123456789";//4 char ss2[] = "0123456789"; //11 char ss3[100] = "0123456789";//100 int ss4[100];//400 char q1[] = "abc";//4 char q2[] = "a\n";//3 char *q3 = "a\n";//4 int lenA = sizeof(A);//6 int lenB = sizeof(B);//8 char *str1 = (char*)malloc(100);//4 void *str2 = (void*)malloc(100);//4 }
cpu的优化规则:对于n字节的元素,首地址能被n整除。才能获取最好的性能,所以设计编译器的时候可以遵循这个规则:对于每一个变量,可以从当前位置向后找到第一个满足这个条件的地址作为首地址。
在访问内存的时候,如果地址按照四字节对齐,则访问效率会高很多,这种现象的原因在于访问的硬件电路。一般情况下,地址总线总是按照对齐后的地址来访问。比如从0x00000001开始的四字节内容,系统首先要从0x00000000读4字节,从中取得三个字节,然后在从0x00000004作为其实地址,获取下一个4字节,在从中取得第一个字节,两次组合得到想要的内容。如果地址一开始就是对齐到0x00000000则系统只需要一次读写即可。