结构体内存对齐问题
- 为了提高内存的读取效率,编译器使用内存对齐的技术。
- 1.首先结构体的总字节数需要是“对齐字节”的整数倍,如果不够,要在最后补到整数倍
- 2.结构体内的每个成员的开始地址也有要求,开始地址需要是”该成员和对齐字节中较小的一个”的倍数。
- 3.结构体作为成员时,该成员要从内部最大元素的整数倍开始存储。
- 使用预编译命令可以控制对齐系数,#pragma pack(4)
拷贝构造函数的调用时机
- 用一个类的对象去初始化另一个对象时。
- 往函数中传递对象参数时。
- 从函数中返回一个对象时。
在一个有指针对象的类中至少要实现哪三个函数
- 拷贝构造函数、拷贝赋值运算符、析构函数
如果没有实现拷贝赋值运算符可能会遇到什么问题(深拷贝、浅拷贝)
- 浅拷贝,只拷贝指针的值,深拷贝会再开辟一块新空间,连同指针在堆中指向的内容一块拷贝过去。
- 当一个类中含有对象指针时,如果把该类的一个对象复制给另一个对象,这时会导致两个对象中的指针指向同一块内存,此时一个对象销毁,可能会导致另一个对象中的指针指向的内容被销毁。
new运算符
1 | Foo* pf=new Foo; |
- 这里的new是一个运算符,里面包含两个阶段操作:(1)调用::operator new()函数配置内存;(2)调用Foo::Foo()构造对象内容。
- delete也包含两阶段操作:先调用析构函数,再释放内存。
- 上面的::operator new()与::operator delete()相当于c的malloc()与free();
set_new_handler
- 该函数接收一个函数指针,当new或new[]失败时,就会执行传进来的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// new_handler example
void no_memory () {
std::cout << "Failed to allocate memory!\n";
std::exit (1);
}
int main () {
std::set_new_handler(no_memory);
std::cout << "Attempting to allocate 1 GiB...";
char* p = new char [1024*1024*1024];
std::cout << "Ok\n";
delete[] p;
return 0;
持续更新~
欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/