Effective Modern C++ 学习记录8.28

1.C++中堆(heap)和栈(stack)的区别:

首先说明,在C++中,内存分为5个区:堆、占、自由存储区、全局/静态存储区、常量存储区

栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。
自由存储区:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,        资源将由操作系统在程序结束后自动回收。
堆:是由malloc等分配的内存块,和堆十分相似,用free来释放。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C语言中,全局变量又分为初始化的和未初始化的,C++中没有这一区分)。
常量存储区:这是一块特殊存储区,里边存放常量,不允许修改。

原文链接:https://blog.csdn.net/qq_34175893/article/details/83502412

2.new和malloc的区别

new和delete是C++关键字,需要编译器支持;malloc和free是库函数,需要头文件支持。

void *malloc(int size);
说明:malloc向系统申请分配size字节的内存空间,返回类型为void*类型;

malloc函数使用注意:
1)、malloc返回的是不确定类型的指针,因此在返回前需要做强制类型转换,否则将编译错误;

2)、malloc只管分配内存,并不会初始化,其内存空间中的值可能是随机的。如果分配的这块空
原文链接:https://blog.csdn.net/qq_43530773/article/details/113895903

3.C++移动语义与右值引用

移动语义的“移动”,意味着把某对象持有的资源或内容转移给另一个对象。 在转移资源后,被移动的对象(橙vector)处于“有效但未定义的状态”(valid but unspecified state)。

典型的右值有:

  • 字面值(literal),比如1, true, nullptr——但字符串常量不是右值而是左值,它们被编译器放在数据段(data segment),可以取地址;
  • 非引用类型的函数返回值;
  • 各种内置的运算符组合表达式的计算结果。

典型的左值有:

  • 有名字的变量;
  • 可以取地址的变量;
  • 指针解引用的值(使用语言内置的*->运算符);

“移动语义提升性能” 

当代C++中,交换操作应该这么写:

template<typename T>
void swap(T& a, T& b)
{
    T tmp = std::move(a);
    a = std::move(b);
    b = std::move(tmp);
}

参考::认识C++移动语义与右值引用 - 知乎 (zhihu.com)

---------------------------------------更新

 1.顶层 const 和底层 const

一、判断const修饰啥,是顶层还是底层:

const默认是修饰它左边的符号的,如果左边没有,那么就修饰它右边的符号,比如

1.const int *p;左边没有,看右边的一个,是int,自然就是p指针指向的值不能改变

2. int const *p;此时左边有int,其实和上面一样,还是修饰的int

3. int* const p :修饰的是*,指针不能改变

4. const int *const p :第一个左边没有,所以修饰的是右边的int,第二个左边有,所以修饰的是 * ,因此指针和指针指向的值都不能改变

5. const int const * p :这里两个修饰的都是int了,所以重复修饰了,有的编译器可以通过,但是会有警告,你重复修饰了,有的可能直接编译不过去

顶层表示指针本身是个常量,底层表示指针所指向的对象是个常量。 

参考: C++干货系列——顶层const和底层const - 知乎 (zhihu.com)

顶层const是本身,底层const不是? 

二、区别:

1.当执行对象的拷贝操作时,常量是顶层const不收影响;

底层有影响:拷入和拷出的对象必须具有相同的底层 const 资格,或者两个对象的数据类型必须能够转换,一般来说,非常量可以转化为常量,反之不行。

2.函数重载:

顶层 const 不影响传入函数的对象。

void func(int a);
void func(const int a);

如果形参是某种类型的指针或引用,则通过区分其是否指向的是常量对象还是非常量对象可以实现函数重载。此时的const是底层的。

void func(int a);
//void func(const int a);
void func(const int* a);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值