《C++ Primer Plus(第六版)》(13)(第九章 内存模型和命名空间 笔记)-程序员宅基地

技术标签: c/c++  

1.为了保持通用性,C++使用术语翻译单元,而不是文件,文件不是计算机组织信息时的唯一方式。


2.C++允许编译器使用自己的名称修饰,因此不同的编译器编译出来的二进制模块(对象代码文件),通常是无法链接的。


3.

自动存储持续性:代码块内局部的变量,走过了就自动消失了。

静态存储持续性:程序员了,就一直存在,直到程序结束。起作用域看声明的位置。

线程存储持续性:并行编程用到,使用tread_local声明,则与线程同寿了。

动态存储持续性:用new来分配的内存,直到delete才回收。


4.在C++旧版本和C中,auto是用于显示声明自动存储的。但是因为自动存储在局部变量中是默认的,所以几乎没人使用。

在C++11之后auto这样的用法被删掉了,改成自动类型推断。


5.自动存储被放在栈中。

栈是用来对自动变量进行管理,之所以成为栈,就是新数据被象征性放在原有数据的上面。

栈是后进先出的。

栈使用两个指针,一个在底部,一个在顶部,上面的数据没用之后,顶部指针向下移动,之前的位置上的内容就不再被标记,但是没有删除的。

当下一个数据放入栈中的时候,就会覆盖刚刚的内容。


6.静态存储的变量,因为一直存在,所以编译器分配了固定的位置给它们。变量的每个元素或成员的默认值都是0。


7.内部链接和外部链接的问题。

先看看代码:

main.cpp

#include "Test.h"
#include <iostream>

using namespace std;

extern int test;
extern int test2;
void tttttt()
{
	cout << test << endl;
	cout << test2 << endl;
}
Test.h

#ifndef _Test_H_
#define _Test_H_

void tttttt();
#endif
Test.cpp

#include "Test.h"
#include <iostream>

using namespace std;

extern int test;
extern int test2;
void tttttt()
{
	cout << test << endl;
	cout << test2 << endl;
}

在main.cpp里面声明了静态变量test,和test2.只有test2用了static。

在Test.cpp中是无法直接使用的。

所以使用了外部声明。但是因为test是外部链接的,所以能链接上。

而test2是内部链接的。链接不上,实际上,编译的时候会报错:

1>------ 已启动生成:  项目: CppPrimer, 配置: Debug Win32 ------
1>  main.cpp
1>  Test.cpp
1>  正在生成代码...
1>Test.obj : error LNK2001: 无法解析的外部符号 "int test2" (?test2@@3HA)
1>E:\mywokespace\CppGame\Debug\CppPrimer.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========


8.使用了extern来声明的变量,没有分配内存,而且必须有一个文件内是真正定义的。


9.存储说明符

auto(C++11中已经不是说明符了)

register(C++11以前是指示寄存器存储,C++11之后就是显式支出自动变量)

static:静态存储

extern:外部变量

thread_local:线程变量,C++11新增的,可以与static或extern一起使用

mutable:声明这样的成员,表示即使变量为const,其属性也可以改变


cv-限定符:

const:常量

volatile:中文意思是可变的,多变的,声明了这个关键字的变量,可能即使不对其进行修改,其本身也会产生变化。

声明了volatile的变量,将不再放在寄存器中进行访问优化。


10.使用外部C语言库的时候,引用他们的函数可以用extern

extern "C" void spiff(int);

即使是同一个编译器,编译出的C和C++的链接语言也可能不同。因为C中没有重载,C++有重载,所以函数名肯定要复杂多。


11.通常编译器使用三块独立的内存:静态变量,自动变量(栈),动态变量(堆)。


12.using可以指定使用命名空间,可以指定使用命名空间中的某个属性。

#include <iostream>
#include <array>
#include <string>
#include <set>
//#include "test.h"
using namespace std;//使用命名空间
namespace FableGame
{
	int test = 1;
}
int test = 2;
int main()
{
	using FableGame::test;//使用某个属性
	cout << test << endl;//1
	cout << ::test << endl;//2


	std::cin.get();
	std::cin.get();
	return 0;
}

13.可以给名称空间创建别名,例如:

namespace a {};
namespace b = a;













转载于:https://www.cnblogs.com/fablegame/p/6430251.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30807677/article/details/95082906

智能推荐

rmd中无法打开链结r_R语言数据实战 | 代码规范与文档撰写-程序员宅基地

点击上方“蓝字”带你去看小星星R语言虽然有着强大的统计分析和绘图功能,但说到底它是一门编程语言。既然如此,那么R语言就有自己的代码规范,这些规范旨在让R学习者养成良好的代码写作习惯,也方便代码作者和他人阅读代码。至于R语言文档撰写,R Markdown是一款基于Markdown功能强大的R语言文档撰写和排版工具,它可以轻松地重现我们的数据分析工作。本节将了解基本的R语言代码规范和如何利用..._同样的代码在rscript可以运行 rmd不可以

Yii2学习笔记1--Yii2的基本介绍和Composer安装-程序员宅基地

一、Yii的基本介绍  Yii 是一个高性能的,以快速,安全,专业著称 , 适用于开发 WEB2.0 应用的 PHP 框架 。自带了丰富的功能 ,包括 MVC,DAO/ActiveRecord,I18N/L10N,缓存,身份验证和基于角色的访问控制,脚手架,测试等,可显著缩短开发时间。二、Yii1.1和Yii2  没有Yii1.1的经验,并不妨碍对Yii2.0的学习。因为对ThinkP...

java学习笔记8 - maven profile实现多环境打包_java打包是选择prod.-程序员宅基地

项目开发需要有多个环境,一般为开发,测试,预发,正式4个环境,通过maven可以实现按不同环境进行打包部署,命令为: mvn package -P dev其中“dev“为环境的变量id, 可以自己定义, 我定义的名称为:dev,qa,pre,prod , 具体在pom.xml中的配置如下:

问题 C: 算法9-5~9-8:二叉排序树的基本操作_在本题中,读入一串整数,首先利用这些整数构造一棵二叉排序树。另外给定多次查询,-程序员宅基地

时间限制:1 Sec内存限制:32 MB提交:667解决:410[提交][状态][讨论版]题目描述二叉排序树或者是一棵空树,或者是具有以下几条性质的二叉树:1.若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;2.若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;3.它的左右子树也分别为二叉排序树。二叉排序树又可以被称为二叉查找树,根据上述定义的结构不难知道,它的查找过程十分简单,只需要通过不断的..._在本题中,读入一串整数,首先利用这些整数构造一棵二叉排序树。另外给定多次查询,

无线通信中FEC 编码原理及评价(4)_fec编码有哪几种模式-程序员宅基地

大家好,前面我们给大家介绍了无线通信中FEC编码原理(1)、(2)和(3),今天继续献上最后一篇,FEC编码原理及评价(4),关于无线通信FEC种类的评价,希望对大家有所帮助~FEC编码原理及评价(3)请参考:http://blog.csdn.net/wiznet2012/article/details/7492146 2.无线通信中的FECFEC编码在无线通信中有很多应用。_fec编码有哪几种模式

nyoj-20-吝啬的国度(深搜)-程序员宅基地

吝啬的国度时间限制:1000 ms | 内存限制:65535 KB难度:3描写叙述在一个吝啬的国度里有N个城市。这N个城市间仅仅有N-1条路把这个N个城市连接起来。如今,Tom在第S号城市,他有张该国地图。他想知道如果自己要去參观第T号城市。必须经过的前一个城市是几号城市(如果你不走反复的路)。输入第一行输入一个整数M表示測试数据共同...

随便推点

python底层设计:列表对象设计_py_xsetref-程序员宅基地

目录1.初识PyListObject2.PyListObject对象的创建和维护2.1创建对象2.2设置元素2.3 内存分配方式2.4.常见操作原理:3.PyListObject对象缓冲池1.初识PyListObject python里的列表不是书上基于链表的列表,而是基于可变长度的数组。PyListObject对象可以有效支持元素插入添加删除等操作..._py_xsetref

面试题:请问 cookie,localStorage,sessionStorage 的区别_https://blog.csdn.net/jiang7701037/article/details-程序员宅基地

答:cookie是在HTML4中使用的给客户端保存数据的,也可以和session配合实现跟踪浏览器用户身份;而webstorage(包括:localStorage和sessionStorage)是在HTML5提出来的,纯粹为了保存数据,不会与服务器端通信。WebStorage两个主要目标:(1)提供一种在cookie之外存储会话数据的路径。(2)提供一种存储大量可以跨会话存在的数据的机制。..._https://blog.csdn.net/jiang7701037/article/details/89118086

SVN版本冲突解决详解@http://blog.csdn.net/windone0109/article/details/4857044_svn版本5020直接到5029了-程序员宅基地

版本冲突原因:假设A、B两个用户都在版本号为100的时候,更新了kingtuns.txt这个文件,A用户在修改完成之后提交kingtuns.txt到服务器,这个时候提交成功,这个时候kingtuns.txt文件的版本号已经变成101了。同时B用户在版本号为100的kingtuns.txt文件上作修改,修改完成之后提交到服务器时,由于不是在当前最新的101版本上作的修改,所以导致提交失败。_svn版本5020直接到5029了

Object.values()获取对象中的所有值,并返回一个数组_object values-程序员宅基地

Object.values()作用:返回一个数组,返回值是对象自身的(不含继承的)所有可遍历( enumerable )属性的键值。Object.values()返回一个数组,其元素是在对象上找到的可枚举属性值。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for…in循环的顺序相同 ( ..._object values

/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8 is not a symbolic link解决方法-程序员宅基地

然后,我们需要对出错的链接进行重定位。比如我上述报错的第一条内容是。这个问题是符号链接导致的,我们对报错的链接重新定位即可。,而从上图中可以看到,我有个。

idea_idea是编译器吗_菩 提、的博客-程序员宅基地

IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版本还支持HTML,CSS,PHP,MySQL,Python等。免费版只支持Java_idea是编译器吗

推荐文章

热门文章

相关标签