内存对齐
//#pragma pack(4) //修改默认对齐数
#include <iostream>
using namespace std;
class A
{
public:
int _a; // 4
char _c; // 5
double _d; // 16
float _f; // 20
// 最高原则:结构体/类大小是最大成员的整数倍 24
// 有结构体定义,但是不算具体对象,所以不占大小
struct B
{
int _a;
char _c;
float _f;
};
B _b;
};
内存读取设备一般是按照数据块进行读取,内存读取能提高获取数据的效率.(1. 减少读取数据的次数, 2.简化解析数据的过程)
大小端
int a = 0x12345678;
大端存放 : 12 34 56 78 (低地址存高位, 高地址存低位)
小端存放 : 78 56 34 12 (低地址存低位, 高地址存高位)
可由联合体或者int* 强转为char* 推断大小端
union C
{
int _a;
char _c;
};
void test()
{
C c;
c._a = 1;
if (c._c == 1)
cout << "小端" << endl;
else
cout << "大端" << endl;
int a = 1;
char* pa = (char*)&a;
if (*pa == 1)
cout << "小端" << endl;
else
cout << "大端" << endl;
}
// 计算类内成员相对于起始位置的偏移量
void test3()
{
A a;
char* pa = (char*)&a;
char* pf = (char*)&a._f;
cout << pf - pa << endl;
}
构造和析构
- 构造函数
构造函数: 初始化成员
函数名与类型相同, 无返回值, 可以重载
如果不显示定义,编译器会自动生成一个默认的构造函数
如果已经显示定义了构造函数,编译器奖不在默认生成
创建对象时,编译器自动调用对应的构造函数
默认构造: 编译器自动生成,无参,全缺省,但是只用存在一个
全缺省,也是默认构造函数 - 拷贝构造
拷贝构造: 创建一个和已经存在的对象完全一样的新对象
参数类型为引用,不能是值,否则会引发无穷递归
也属于构造函数的一种重载形式
如果不显示定义,编译器会自动生成一个拷贝构造, 完成字节拷贝,即浅拷贝 - 析构函数
析构函数: 资源清理 —> 堆上的资源,打开的文件,网络连接等
对象的生命周期结束时,编译器自动调用
函数名: ~类名, 无参无返回值,不能重载
如果不定义,编译器会自动生成
this 指针
类型 : 实质为 类类型* const (比如A* const)
指向自身调用的类对象
普通的成员函数中,作为成员函数的第一个形参
如果不做解引用, this可以为空