1.数据类型的字节数
int类型通常代表特定机器的自然长度,可以是16位或32位;short类型通常是16位;long类型通常是32位
类型的位数一般只对编译器可见,位数是多少可用sizeof来看,各编译器可根据硬件的特性自主的选择类型位数,但必须遵循特定的规则:short型和int型至少为16位,long型至少为32位,而且short不得超过int型,int型不得超过long型。有一点是编译器在自主选择类型时要受到OS位数的限制,而OS又要受到CPU可寻址位数的限制,32的CPU当然最大为32位(不过听说可扩展……)。
2.结构体
结构体所占内存大小问题:
结构体所占内存大小与结构体的对齐方式有关
编译器为了优化cpu读取内存的效率,在生成结构体成员的起始地址时遵循着某种特定的规则,这就是所谓的“内存对齐”方式。这个规则为“对于n个字节(n=1、2、4、、、、就是short、int等)的元素,它的首地址能被n整除”;而且结构体中的成员在内存中是顺序存放的,所占内存地址一次增高,第一个字节出于低地址处,最后一个字节位于搞地址处,但结构体成员的内存分配不一定是连续的,编译器会按照前面介绍的成员对齐方式进行处理。 其实每个编译器也可以设置一个默认的对齐方式n,但这个n并不一定是实际的对齐方式,实际对每个元素的对齐参数N要按照这个原则:“N=min(sizeof(成员变量),n)”进行分配,最后整体的要求是:“对这个结构体所占用的内存一定是其成员中最大对齐参数N(与编译器的默认参数比较过的)的最小整数倍,不足时补空字节”【另外结构体对齐的具体实现也与硬件有关,就是CPU的“字节序”问题,有的是“小端”有的是“大端”】
什么时候为结构体分配内存?:
其实在C++中结构体和类没什么区别,只是变量的默认权限不一样,在这里也可以当做类来理解,就是当只写:typedef struct _temp{...}时,只是定义了一个类,并没有对齐实例化,当然也就没有为其分配内存,当用struct _temp temp;定义了一个变量temp,也就是相当于创建了一个实例,也就分配了内存,只是这时,在这个变量中的成员的地址中存放的并不是你想要的值,什么乱七八糟的值都有可能,所以在定义之后最好初始化。
3.在C中有没有string类型
在C中没有string类型,在C++中才有,在C中string就是以‘\0’结尾的字符数组,而且在C中也不可能写一个替代,因为在C++中string类型是数据和操作封装在一起的,在C不可能实现,但在C中在string.h中定义了strstr( ,)、strncat( , , )等对字符数组(也就是字符串)的处理函数。在C++中使用string类型时,也要调用<string>头文件,注意这里在新的C++中不用<string.h>,而与C中的string.h相对应的库函数在<cstring>中,注意<cstring.h>库函数已经废弃,还有在使用<string>这一类头文件中的函数、变量时,最好用“using namespaces std;”(不过也有的说“在使用stl空间中的类/函数/模板时才使用这一句”)防止重名。
4.char *a="abc"与char a[]="abc"的区别
一个在栈中,一个在堆中
char *a="abc":
其中"abc”存放在常量存储区,a存放在栈中,a指向"abc"在常量存储区的首地址,常量存储区中的内容为只读,不可修改,a[0]='e';//错误;在编译的过程中进行初始化,在程序结束时由系统释放。
char a[]="abc":
存放在栈中,在程序运行的过程中初始化,可修改内容,a[0]='e';//ok,在程序执行完其作用域时释放。