C++学习记录2 C/C++:数据类型与字节对齐

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. 只要有虚函数就会占用一个指针大小的内存,原因是系统多用一个指针维护这个类的虚函数表。

总之,甚至还可能涉及深浅拷贝等问题。要结合类的知识,具体情况具体分析。

参考文献:

深入理解字节对齐-CSDN博客

【C++】使用sizeof计算类对象所占空间大小-sizeof总结_系统为类分配的存储空间可通过sizeof计算-CSDN博客

[C++] 类对象所占内存空间分析和总结_类占的空间-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值