第九章——内存模型和名称空间

news2024/11/25 22:45:16

单独编译 

C++允许程序员将组件函数放在独立的文件中。下面列出了头文件中常包含的内容:

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

将结构声明放在头文件中是可以的,因为它们不创建变量,而只是在源代码文件中声明结构变量时,告诉编译器如何创建该结构变量;同样模板声明不是将被编译的代码,它们指示编译器如何生成与源代码中的函数调用相匹配的函数定义

对于头文件,如果是标准头文件,就要用尖括号包含,C++编译器将在存储标准头文件的主机系统的文件系统中查询 ;如果是自己写的头文件,就要包含在双引号中,编译器首先查找当前的工作目录或源代码目录,如果没有找到,才会在标准位置查找。

头文件管理

在同一个文件中只能将同一个头文件包含一次。但是可能在不知情的情况下将头文件包含多次,例如可能使用了包含另外一个头文件的头文件。有一种标准的C/C++技术可以避免多次包含同一个头文件。它是基于预处理器编译指令#define的(现假设有一个头文件COORDIN_H)

#ifndef COORDIN_H
#define COORDIN_H

//place include file contents here

#endif

 上面的语句意味着仅当以前没有使用预处理器编译指令#define COORDIN_H时,才处理#ifndef和#endif之间的语句

编译器首次遇到该文件时,名称COORDIN_H没有定义,这时编译器将查看#ifndef和#endif之间的内容(正是我们希望的),并读取定义COORDIN_H的一行。如果在同一个文件中遇到其他包含coordin.h的代码,编译器将知道COORDIN_H已经被定义了,从而跳到#endif后面的一行。(注意:这种方法并不能防止编译器将文件包含两次,而只是让它忽略除第一次包含之外的所有内容)

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

 存储类别 如何影响信息在文件中的共享

  • 自动存储持续性:在函数定义中声名的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放
  • 静态存储持续性:在函数定义外定义的变量和使用关键字ststic定义的变量的存储性都为静态。它们在程序整个运行过程中都存在
  • 线程存储持续性:当前多核处理器很常见,这些CPU可同时处理多个执行任务,这让程序能够将计算放在可并行处理的不同线程中。
  • 动态存储持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。这种内存的存储持续性为动态,有时被称为自由存储(free store)或堆(heap)

作用域和链接 

作用域描述了名称在文件的多大范围内可见。(例如,函数中定义的变量可在该函数中使用,但不能在其他函数中使用;而在文件中的函数定义之前的变量则可在所有函数中使用)。链接性描述了名称如何在不同单元间共享

C++变量的作用域有多种。作用域为局部的变量只在定义它的代码块中可用。代码块是由花括号括起来的一系列语句。作用域为全局的变量在定义位置到文件末尾之间都可以使用

自动存储持续性

 默认情况下,在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性。也就是说如果在代码块中定义了变量,则该变量的存在时间和作用域将被限制在该代码块内

 

 静态持续变量

C++为静态持续变量提供了3种链接性:外部链接性(可在其他文件中访问)、内部链接性(只能在当前文件中访问)和无链接性(只能在当前函数或代码块中访问)

要想创建链接性为外部的静态持续变量,必须在代码块的外面声明它;要想创建链接性为内部的静态持续变量,必须在代码块的外面声明它,并使用static限定符;要创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static限定符

int global = 1000;            //static duration, external linkage
static int one_file = 50;     //static duration, internal linkage
int main()
{
...
}

void funct1(int n)
{
    static int count = 0;     //static duration, no linkage
    int llama = 0;
}

void funct2(int q)
{
...
}

所有静态持续变量(上例中的global、one_file、count)在整个程序执行期间都存在

在funct1()中声名的变量的count的作用域为局部,没有链接性,这意味着只能在funct1()函数中使用它,就像自动变量llama一样。但是与llama不同的是,即使在funct1()函数没有被执行时,count也留在内存中。

global和one_file的作用域都为整个文件,即在从声明位置到文件结尾的范围内都可以被使用。具体来说就是可以在main()、funct1()和funct2()中使用它们。由于one_file的链接性为内部,因此只能在包含上述代码的文件中使用它;而global的链接性为外部,因此可以在程序的其他文件中使用它

所有的静态持续变量都有如下初始化特征:未被初始化的静态变量的所有位都被设置为0.这种变量被称为零初始化的。

名称空间

在C++中,名称可以是变量、函数、结构、枚举、类以及类和结构的成员

传统的C++名称空间

声明区域。声明区域是可以在其中进行声明的区域。例如可以在函数外面声明全局变量,对于这种变量其声明区域为其声明所在的文件

 

潜在作用域。变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。(然而,变量并非在其潜在作用域内的任何位置都是可见的,例如它可能被另一个在嵌套声明区域中声明的同名变量隐蔽。

 

 新的名称空间特性

C++新增了这样一种功能,即通过定义一种新的声明区域来创建命名的名称空间,这样提供了一个声明名称的区域。一个名称空间中的名称不会与另一个名称空间中的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声名的东西。下面使用新的关键字namespace 创建两个名称空间:T1和T2

namespace T1{
    double pail;
    void fetch();
    int pal;
    struct Well{...};
}

namespace T2{
    double bucket(double n);
    double fetch;
    int pal;
    struct Hill{...};
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构--树的存储结构

数据结构–树的存储结构 树的逻辑结构 树是 n ( n ≥ 0 ) n (n\ge0) n(n≥0)个结点的有限集合,n 0 时,称为空树,这是一种特殊情况。 在任意一棵非空树中应满足: 1)有且仅有一个特定的称为 根 …

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

操作系统接口 MIT 6.828 - 1. Lab 01: Xv6 and Unix utilities

本文会将lab1中的思路以及知识点进行分析,并作为作者学习MIT 6.828的一个学习总结,希望能够帮助到学习该lab的同学们 中文版书籍:中文版书籍 实验教案地址:教案地址 操作系统接口 在操作系统中,为了能够有效地与操作系…

Amelia、Bookly 和 Booked:哪个WordPress预约插件更好?

各种企业都需要预订软件来管理预约。然而,开发预订系统是网站中最复杂和最昂贵的元素之一。 那些使用 WordPress 构建网站的人有一个优势。只需点击几下,他们就可以将预约插件集成到他们的网站中。 预约插件是一个预订向导,可以自动执行和管…

数据结构——堆的实现(细)

目录 1.1 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆…

Netty核心技术十--Netty 核心源码剖析

1. 基本说明 只有看过Netty源码,才能说是真的掌握了Netty框架。 在 io.netty.example 包下,有很多Netty源码案例,可以用来分析 2. netty 启动过程源码分析 本次分析使用的是example包下的echo 2.1 源码剖析的目的 用源码分析的方式走一下…

Java 动态规划 Leetcode 63. 不同路径 II

该题大部分思路可以根据Leetcode 62. 不同路径这篇博客了解 这里进行基于上面那篇博客后来对该题进行补充 代码展示: class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int mobstacleGrid.length;int nobstacleGrid[0].length;//创建…

HDFS块详解

HDFS块详解 传统型分布式文件系统的缺点 现在想象一下这种情况:有四个文件 0.5TB的file1,1.2TB的file2,50GB的file3,100GB的file4;有7个服务器,每个服务器上有10个1TB的硬盘。 在存储方式上,我…

Docker安装ElasticSearch8.X docker安装elasticsearch8.X完整详细教程

Docker安装ElasticSearch8.X docker安装elasticsearch8.X完整详细教程 Docker 上安装 ElasticSearch 8.8.1 的步骤:选择要安装的ElasticSearch 版本1、拉取 ElasticSearch 镜像2、创建并运行容器关闭容器启动容器重启容器 3、elasticsearch常用端口以及作用4、测试&…

基于spring cloud alibaba的低代码核心工具,jvs-logic逻辑引擎

在现代企业管理中,决策扮演着至关重要的角色。然而,随着业务规模的扩大和数据量的增加,人工决策变得越来越困难和耗时,而且容易受到主观因素的影响。逻辑引擎的出现为企业提供了一种高效、准确的决策推理工具,能够以逻…

[工业互联-23]:EtherCat从站 - EtherCAT协议栈与工作原理, 软硬件解决方案

目录 第1章 EtherCAT通信原理 1.1 网络架构 1.2 分层模型 2.1 物理层 1.2 数据链路层 1.2.1 EtherCAT数据帧结构 1.2.2 EtherCAT报文寻址 第2章 EtherCAT从站 2.1 概述 2.2 EtherCAT从站的组成包括: 2.3 EtherCAT从站的硬件 2.4 从站控制信息芯片&#…

LeetCode[394]字符串解码

难度:Medium 题目: 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;…

【LeetCode热题100】打卡第34天:排序链表乘积最大的子数组

文章目录 【LeetCode热题100】打卡第34天:排序链表&乘积最大的子数组⛅前言 排序链表🔒题目🔑题解 乘积最大的子数组🔒题目🔑题解 【LeetCode热题100】打卡第34天:排序链表&乘积最大的子数组 ⛅前…

如何将文字转化为语音?三个方法帮你轻松实现!

如何将文字转化为语音?在工作或学习中,我们可能会遇到需要将文字转化为语音的情况,这可能会让一些人感到困惑,不知道如何实现这个转换。其实,只需要利用一些第三方工具,就可以轻松地将文字转化为语音。下面…

十四、flex弹性容器属性样式2

目录: 1.准备工作 2.属性解析: align-items 3.属性解析: align-content 4.弹性元素的属性 一、准备工作 我们在前面的基础上,修改代码,把ul的高度定下来,设置800px, li的高度不定。 然后,body里…

音频采样器 Native Instruments Kontakt7 forMac/Windows图文安装教程

Native Instruments Kontakt是一款功能强大、灵活易用的音乐采样软件,适用于各种音乐创作和制作需求。无论是专业音乐制作人还是初学者,都能通过它来实现创意的音乐作品。 Kontakt具有直观的用户界面,可通过拖放方式导入和管理采样库。它支持…

Vmware虚拟机网络配置回顾

如何配置Vmware里的虚拟机网络?这个东西不常用,都是自己练手用的。能用就行,千万不要花时间记,没意义。 很简单,照着敲 首先登陆自己的虚拟机 vim /etc/sysconfig/network-scripts/ifcfg-ens32 TYPE"Ethernet&q…

数据结构--并查集

数据结构–并查集 逻辑结构―—“集合” 所有元素的全集s 将各个元素划分为若干个互不相交的子集 用互不相交的树,表示多个“集合” “并查集”的存储结构 用一个数组S[ ]即可表示“集合”关系 ‘并查集”的基本操作 集合的两个基本操作―— “并” \color{red}“…

ios14~14.3越狱/root(Taurine牛磺酸1.1.6)

Taurine牛磺酸 一键完美越狱 windows安装时建议关闭本地安全中心(若报毒的话,没有则忽略) 1.安装windows端AltInstaller:安装成功后,电脑右下角控制中心有一个(灰色的 小方块) 2.安装手机端A…

layui入门

layui入门 一.ayui简介1.简单易用2.组件丰富3.高度定制化4.响应式布局5.轻量灵活 2.layui的入门基础操作3.登录实例4.注册实例 一.ayui简介 Layui(流行音 “layui”,来自“领域的模块化”)是一款前端UI框架,专注于提升 Web 开发效…