c++拾遗-----内存模型

本文介绍了C++编程中的几个重要概念,包括如何通过单独编译提高模块化程度,存储持续性、作用域和链接性的理解及应用,以及如何利用new运算符进行内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、单独编译

将程序拆成三部分:

  • 头文件:包含结构声明和使用这些结构声明的函数
  • 源代码文件:包含与结构有关的函数的代码
  • 源代码文件:包含调用与结构有关的函数的代码

头文件中一般包含以下内容:

  • 函数原型
  • 用#define或const定义的符号常量
  • 结构声明
  • 类声明
  • 模板声明
  • 内联函数

为防止在一个文件中包含同一个头文件多次, 在头文件中加上如下代码:

#ifndefine COORDIN_H
#define COORDIN_H
//place include file content here
#endif

2、存储持续性、作用域、和链接性

1、作用域:描述了名称在文件多大的范围内可见

2、链接性:描述了名称如何在不同的单元间共享

自动存储性

在默认情况下,在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性。

静态持续变量

1、外部链接性

在代码块的外面声明它,在其他文件中使用该变量是添加关键字extern,且不初始化。

2、内部链接性

在代码块外面声明它,并使用static限定符

3、没有链接性

在代码块内部声明,并使用static限定符

image

存储说明符

1、auto:用于自动推断类型

2、register:用于在声明中指示寄存器存储

3、static:被用在作用域为整个文件的声明中,表示内部链接性;被用于局部变量,表明局部变量的持续性是静态的

4、extern:引用的变量声明在别处

5、thread_local:指出变量的持续性与其所属线程的持续性相同

6、mutable:即使结构或类变量为const,其某个成员仍可以被修改

cv-限定符

1、volatile:如果程序在几条语句中两次使用了某个变量的值,则编译器可能不是让程序查找这个值两次,而是将这个值保存到缓存,将变量声明为volatile。

2、const,会把全局变量的链接性修改成内部的,如果希望某个某个常量的链接性是外部的,则可以使用extern关键字来覆盖默认的链接性,

extern const int a=5;

在这种情况下,所有使用该常量的文件中都必须使用extern关键字来声明它,但只能有一个对其进行初始化

语言链接性

链接程序需要每个函数都有不同的符号名,在C中一个函数只对应一个名称,但在c++中,一个名称可能对应多个函数,因此c++编译器执行函数名称矫正或修饰,为重载函数生成不同符号名称。

链接程序在寻找与c++匹配的函数名称时使用的方法与C不同。如果要在c++程序中使用C库中预编译的函数,可以通过函数原型来指出要约定的函数。

extern "C" void spiff(int) //use C protocol for name look-up
extern void spiff(int) //use C++ protocol for name look-up
extern "C++" void spiff(int) //use C++ protocol for name look-up

存储方案和动态分配

1、使用new运算符初始化

int *p=new int(6); //*p set to 6

2、new失败时

以前返回空指针,现在引发异常std::bad_alloc

3、new:运算符、函数和替换函数

运算符new,new[]分别调用以下函数

void operator new(std::size_t);
void operator new[](std::size_t);

同样的也有delete和delete[]函数

void operator delete(void *);
void operator delete[](void *);

4、定位new运算符

palcement new运算符,可以指定 要使用的位置

#include<iostream>
char buff[100];
int main()
{
    using namespace std;
    int *p = new (buff) int[5];
    memset(p,0,5);
    cout << p << " " << (void *)buff<<endl;
    for (int i = 0; i < 5; i++, p++)
    {
        cout << *p << " ";
    }
    system("pause");
    return 0;
}

其中指针p指向的地址与buff地址一致。且不能用delete释放p指向内存,因为不是由new申请的空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值