百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

内存模型和名称空间

haoteby 2024-11-22 15:24 18 浏览

第一部分:单独编译

1. C++程序文件一般分成3部分:1个头文件、1个源文件和其他源文件。

  • 头文件经常包含的内容有:结构体声明类声明函数原型使用#define或const定义的符号常量模板声明内联函数等。
  • 1个源文件的内容是:头文件中相关函数定义的代码。
  • 其他源文件的内容是:调用头文件中函数的代码。

其他源文件调用函数时,只要包含头文件即可。这是一种非常有效的组织程序的策略,也符合面向对象编程(OOP)的思想。

2. 在源文件中包含头文件时,如果文件名包含在尖括号(<>)中,则编译器将在存储标准头文件的主机系统的文件系统中查找;但如果头文件包含在引号("")中,则编译器首先查找当前的工作目录或源代码目录(或其他目录,取决于编译器),若没有在那里找到头文件,继续在标准位置查找。因此,对于开发人员自身编写的头文件,应将文件名包含在引号("")中。

3. 在同一个文件中只能将同一个头文件包含1次,否则会导致多重定义。为了避免头文件重复包含的问题,也为了减轻开发人员查找此类问题的负担,需使用预处理编译指令(#ifdef、#ifndef和#endif等)来做防护。

第二部分:存储持续性、作用域和链接性

C++有三种管理数据内存的方式:自动存储、静态存储和动态存储(也叫自由存储空间或堆),这些方式的区别是数据保留在内存中的时间。不同的存储方式是通过存储持续性作用域链接性来描述的。

存储持续性:①自动存储持续性:具有该存储持续性的变量在程序执行到所在代码块中的变量声明时被创建,代码块执行完后被释放。②静态存储持续性:具有该存储持续性的变量在程序整个运行过程中都存在。③动态存储持续性:用new运算符分配的内存将一直存在,直至delete运算符释放或者程序结束。

作用域:描述了名称在文件(翻译单元)的多大范围内可见。有全局作用域、局部作用域和名称空间作用域等。

链接性:描述了名称如何在不同文件(翻译单元)之间共享。连接性为外部的名称可在不同文件(翻译单元)间共享,连接性为内部的名称只能由一个文件(翻译单元)中的函数共享。

不同类型变量的存储持续性、作用域和连接性:①自动变量:代码块中声明的变量、函数参数,分配在内存的栈空间,由程序进行管理。它们的存储持续性为自动,作用域为局部,没有连接性;②静态变量:在代码块外部定义的变量或者利用static关键字声明的变量,分配在内存的全局区,程序不需要进行管理。它们具有静态存储持续性,但可以有3种链接性,不同链接性的作用域也不同。要想创建链接性为外部的静态变量,必须在代码块外部声明,作用域为声明文件和其他引用该变量的文件;要创建链接性为内部的静态变量,必须在代码块外部声明并使用static关键字,作用域为声明该变量的文件;要创建没有链接性的静态变量,必须在代码块内部声明并使用static关键字,作用域为代码块。③动态存储变量:指向堆内存的指针变量。该指针变量可以是静态变量也可以是自动变量。

具有外部链接性的静态变量也叫全局变量

静态变量有以下特性:未被初始化的静态变量的所有位都被置为0,称为零初始化。

第三部分:名称空间

为了防止名称冲突,C++提供了名称空间,即通过定义一种新的声明区域来创建命名的名称空间。一个名称空间内的名称不会与另外一个名称空间内的名称冲突,同时允许程序的其他部分使用该名称空间内声明的东西。名称空间的声明语法:

namespace name
{
}

名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,一般在名称空间中声明的名称是外部链接性。

除了用户定义的名称空间外,还有另一个名称空间---全局名称空间。它对应于文件级声明区域,因此全局变量是位于全局名称空间中。

名称空间是开放的,可以把名称加到已有的名称空间中。

通过作用域解析符(::)使用名称空间来限定名称。

C++提供了两种机制来简化对名称空间中的名称的使用。①using声明:由被限定的名称和using关键字组成,使得特定的标识符可用;②using编译指令:由名称空间名和using关键字组成,使得一个名称空间可用。

可以通过省略名称空间的名称来创建未命名的名称空间,提供了链接性为内部的静态变量的替代品。

第四部分:实战练习

下面代码输出什么结果?

#include <iostream>
using namespace std;
void other();

namespace nFirst
{
    int x = 1;
}

namespace nSecond
{
    int x = 2;
}

int main()
{
    using namespace nFirst;
    cout << x << endl;

    {
        int x = 4;
        cout << "x = " << x << ",nFirst::x =" << nFirst::x << ", nSecond::x = " << nSecond::x << endl;
    }

    using nSecond::x;
    cout << x << endl;
    other();

    system("pause");
    return 0;
}

void other()
{
    using namespace nSecond;
    cout << x << endl;

    {
        int x = 4;
        cout << "x = " << x << ",nFirst::x =" << nFirst::x << ", nSecond::x = " << nSecond::x << endl;
    }

    using nFirst::x;
    cout << x << endl;
}

代码的输出结果如下:

相关推荐

Chrome OS 41 用 Freon 取代 X11_chrome os atom

在刚发布的ChromeOS41里,除了常规的Wi-Fi稳定性提升(几乎所有系统的changelog里都会包含这一项)、访客模式壁纸等之外,还存在底层改变。这一更新中Google移除...

苹果iPad Pro再曝光 有望今年六月发布

自进入2015年以后,有关大屏iPad的消息便一直不绝于耳,之前就有不少媒体猜想这款全新的平板电脑将会在三月发布,不过可惜的是我么只在那次发布会上看到了MacBookPro。近日@Ubuntu团队便...

雷卯针对香橙派Orange Pi 5 Max开发板防雷防静电方案

一、应用场景高端平板、边缘计算、人工智能、云计算、AR/VR、智能安防、智能家居、Linux桌面计算机、Linux网络服务器、Android平板、Android游戏机...

Ubuntu Server无法更新问题解决_ubuntu server not found

上周老家的一台运行UbuntuServer的盒子无法连接上了,中秋这两天回来打开,顺手更新一下发现更新报错。提示`E:Releasefileforhttps://mirrors.aliyun...

虚幻引擎5正式版发布:古墓丽影&amp;巫师新作采用、新一代实时渲染

机器之心报道编辑:杜伟、陈萍虚幻引擎5的目标是「助力各种规模的团队在视觉领域和互动领域挑战极限,施展无限潜能」。...

AMD Milan-X双路霄龙7773X平台基准测试曝光 CPU缓存总量超1.5GB

OpenBenchmarking基准测试数据库刚刚曝光了AMDMilan-X双路霄龙7773X平台的跑分成绩,虽然很快就被撤下,但我们还是知晓了高达1.6GB的总CPU缓存。早些时...

ROS机器人建模_ros机器人硬件搭建

...

全网最新的Dify(1.7.2)私有化离线部署教程(ARM架构)

Hello,大家好!近期工作中有涉及到Dify私有化离线部署,特别是针对于一些国产设备。因此特别整理了该教程,实测有效!有需要的小伙伴可以参考下!本文主要针对Dify1.7.2最新版本+国产操作系...

在ubuntu下新建asp.net core项目_创建ubuntu

本文一步步讲述在ubuntu下用visualstudiocode创建asp.netcore项目的过程。step1:环境操作系统:virtualbox下安装的lubuntu。请不要开启“硬件...

在晶晨A311D2处理器上进行Linux硬件视频编码
在晶晨A311D2处理器上进行Linux硬件视频编码

在KhadasVIM4AmogicA311D2SBC上,我更多的时间是在使用Ubuntu22.04。它的总体性能还不错,只不过缺少3D图形加速和硬件视...

2025-08-26 17:22 haoteby

Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!

之前和大家分享过JDK17的多版本管理及详细安装过程,然后在项目升级完jdk17后又发现之前的注册和配置中心nacos又用不了,原因是之前的nacos1.3版本的,版本太老了,已经无法适配当前新的JD...

电影质量级渲染来了!虚幻引擎5.3正式发布:已开放下载

快科技9月8日消息,日前,Unrealengine正式发布了虚幻引擎5.3,带来了大量全方位的改进。...

2025如何选购办公电脑?极摩客mini主机英特尔系列选购指南

当下,迷你主机的性能越来越强,品类也越来越多。但是CPU是不变的,基本都是AMD和英特尔的。有一个小伙伴在评论区提问,我应该如何在众多机器中选购一台符合自己的迷你主机呢?那今天我们优先把我们的系列,分...

ubuntu 20.04+RTX4060 Ti+CUDA 11.7+cudnn

ububtu添加国内源sudocp/etc/apt/sources.list/etc/apt/sources.list.backupsudovim/etc/apt/sources.lis...

Linux Mint 18将重新基于Ubuntu 16.04 带来更好硬件支持

项目负责人ClementLefebvre在本月6日披露了关于LinuxMint18“Sarah”操作系统的大量信息,包括带来全新扁平化体验的Mint-Y主题。而现在,这款将于年底之前上线的操作...