C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
1. 数据类型
1.1 占用内存大小
bool 占用一个字节
char 字符型 占用一个字节 存的是ASCII编码
char arr[] 字符串数组(C) 用来存储一串字符 结尾默认存在“\0”
string 字符串(C++)
2. sizeof关键字
2.1基础用法
char str[] = "C Language", *p = str;
int* t;
string str1 = "C Language";
cout << p << endl; // 输出字符数组的内容直到遇到结束符
cout << *p << endl; // C 解引用字符数组的首地址
cout << sizeof(str) << endl; // 11 字符长度 +结束符
cout << strlen(str) << endl; // 10 字符长度
cout << sizeof(p) << endl; // 8 指针长度 char* 字节长度32位系统上 4 字节 64位系统上8字节
cout << sizeof(t) << endl; // 8
cout << strlen(p) << endl; // 10 字符长度
cout << sizeof(str1) << endl; // 40 string 结构体的大小
printf("len_int=%d,len_short=%d,len_double=%d", sizeof(int), sizeof(short), sizeof(double));
sizeof()只是运算符号,在能在编译期间确定内存大小。也就是说,如果sizeof对动态分配内存的变量无能为力。即sizeof无法统计动态分配的内存大小
2.2 strlen 和 sizeof
strlen () 用于计算字符串的长度,不包括空结束字符(“\0”),strlen统计“\0”之前的所有字符数量
strlen是函数,sizeof是运算操作符。所以,sizeof在编译期间已经计算过了,而strlen则是在程序运行期间计算出来的。
对于 char str4[] = "as\0df";sizeof结果为6(“\0为一个ASCII码 为一个字符,再加上字符串数组最后的“\0”,共6个)
strlen结果为2
2.3 sizeof 求类的大小
前置问题:影响C++对象所占内存大小的因素
类所占内存大小主要计算:类内非静态成员变量的大小以及虚函数的大小(其他成员函数不计算在内),但也要考虑字节对齐问题。
字节对齐:
a. 定义:理论上可以从任何起始地址访问任意类型的变量。实际中在访问特定类型变量时经常在特定的内存地址访问,需要各种类型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是对齐。根本目的在于提高CPU访问数据的效率
b. 如何对齐:
i. 基本数据类型:起始地址为其长度的整数倍即可
指针——32位中为4字节,64位中为8字节
ii. 数组:按照基本数据类型对齐
iii. 结构体:结构体中每个数据类型都要对齐,对齐值为其成员中自身对齐值最大的那个值。
注意:
1. 派生类的内存大小需要加上基类的内存大小。
2. 空类的大小为1个字节。确保两个不同的对象具有不同的地址是非零的。
3. 只要有虚函数就会占用一个指针大小的内存,原因是系统多用一个指针维护这个类的虚函数表。
总之,甚至还可能涉及深浅拷贝等问题。要结合类的知识,具体情况具体分析。
参考文献:
【C++】使用sizeof计算类对象所占空间大小-sizeof总结_系统为类分配的存储空间可通过sizeof计算-CSDN博客