Memory Models And Namespaces
分开编译
不要把变量和函数的定义放到头文件中。
可以分开编译源文件,然后将它们连接起来生成最终的可执行文件。
如果你只修改了一个文件,你可以只重新编译这个文件,之前编译过的其他文件就不需要再次编译了,这样更容易管理大型程序。
C和C++提供了#include,不需要在每个源文件中去声明一遍需要的东西,而只需要用#include去包含头文件就可以了。
不要把函数定义或者变量声明放到头文件中。
比如,在头文件中定义了一个函数,然后这个头文件被另外两个原函数所包含。这样在单个程序中就会包含该函数的重复定义,从而导致错误。除非这个函数是内联的。
头文件中通常包含如下玩意儿:
- Function Prototypes(函数原型)
- Symbolic constants defined using #define or const(使用define或者const定义的符号变量)
- Structure declarations(结构体定义)
- Class declarations(类的定义)
- Template declarations(模板声明)
- Inline functions(内联函数)
/tmp/cckdA59Z.o: In function `nonInlineDemo()': mycode.cpp:(.text+0x0): multiple definition of `nonInlineDemo()' /tmp/ccY1XF2V.o:main.cpp:(.text+0x0): first defined here collect2: error: exit status
可以把structure的声明放到头文件中,是因为它们不会创建变量,而是告诉编译器如何创建一个structure变量。
模板声明也不是可编译的代码,而是告诉编译器如何去生成匹配的函数定义。
const声明和内联函数有特殊的连接属性,使它们可以放在头文件中而不会有啥问题。
#include时对<>和""的区别
<>会让编译器去标准头文件的目录中找。
""会让编译器去工作目录或者源代码目录中找。
不要用#include去包含源文件,这样会导致多重定义
头文件管理
在一个文件中,头文件应该只被引入一次。为什么只能引入一次?
如果你的头文件中包含了structure定义,而你的源文件又多次引入了这个头文件,会导致编译器错误。
看起来简单实际很难避免。
比如a.h和b.h都要include到源文件中,但是b.h也include了a.h,导致源文件include了2次a.h。
解决方法就是:
#ifndef XXX_H_ #define XXX_H_ // 头文件内容 #endif
C++标准中用translation unit而不是file来描述separation compilation。
Storage Duration, Scope, and Linkage
C++种的数据分为三种类型(在C++11中则是四种),这三种类型的区别在于其中的数据可以保存多久。
- 自动存储——在函数中声明的变量(包括函数的参数)。当程序执行进入到函数中或者代码块中的时候它们被定义;离开函数或则代码块的时候它们占用的内存空间就会被释放掉。C++有两种自动存储的变量。
- 静态存储——在函数之外定义的变量或者用关键字static定义的变量是静态存储。这些变量在程序运行的整个期间都会存在。C++有三种静态存储的变量。
- 线程存储(C++11)——用thread_local关键字声明的变量会一直存在,直到包含它的线程死亡变量才会被释放。
- 动态存储——通过new关键字分配的内存直到用delete操作才会被释放或者直到程序结束。
接下来要学习的是:域(scope),可见性(visible)和连接(linkage)。
域(scope)和连接(linkage)
Scope使用来描述在一个文件(或者translation unit)中,一个名称的可见性的范围大小。
比如,在函数中定义的变量只能在这个函数中使用,而不是其他的任何地方;然而在函数之外定义的一个变量名则可以在所有的函数中使用。
Linkage一个名称可以被多少编译单元所共享。
一个external linkage的名称可以被所有的文件所共享,而一个internal linkage的变量则只能
Memory Models And Namespaces的更多相关文章
- System and method for parallel execution of memory transactions using multiple memory models, including SSO, TSO, PSO and RMO
A data processor supports the use of multiple memory models by computer programs. At a device extern ...
- 内存模型(memory models)和命名空间(namespace)
继续<C++ premier plus > 先来解释一下scope和linkage,所谓scope,是指变量的作用范围,所谓linkage,是指变量能否在不同文件中共享 1,自动变量(au ...
- memory consistency
目前的计算机系统中,都是shared memory结构,提供统一的控制接口给软件, shared memory结构中,为了memory correctness,可以将问题分为:memory consi ...
- Method and apparatus for providing total and partial store ordering for a memory in multi-processor system
An improved memory model and implementation is disclosed. The memory model includes a Total Store Or ...
- Django 之models进阶操作
到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 ...
- Synthesis of memory barriers
A framework is provided for automatic inference of memory fences in concurrent programs. A method is ...
- [翻译]内存一致性模型 --- memory consistency model
I will just give the analogy with which I understand memory consistency models (or memory models, fo ...
- Memory Barriers Are Like Source Control Operations
From: http://preshing.com/20120710/memory-barriers-are-like-source-control-operations/ If you use ...
- 内存模型与c++中的memory order
概 c++的atomic使用总会配合各种各样的memory order进行使用,memory order控制了执行结果在多核中的可见顺序,,这个可见顺序与代码序不一定一致(第一句代码执行完成的结果不一 ...
随机推荐
- ajaxupload.js调用始终进入error回调
现象:脚本调用成功,文件上传也成功,但是始终进入error的回调函数. 1. ajaxfileupload.js jQuery.extend({ handleError: function( s, x ...
- Qt Creator中如何添加C++0x支持
最近在学习多线程编程,本人平时习惯使用Qt Creator写程序,只是作为C++编辑器,很少使用Qt library中的类. Multi Threading作为C++11标准已经纳入C++标准库了,可 ...
- [转]使用spring中的@Transactional注解时,可能需要注意的地方
前情提要 在编写业务层方法时,会遇到很多需要事务提交的操作,spring框架为我们提供很方便的做法,就是在需要事务提交的方法上添加@Transactional注解,比起我们自己开启事务.提交以及控制回 ...
- axios 简单常用笔记
简单认知: 1.config.data是POST参数,config.params是GET参数 axios(url, [config]) + qs + application/x-www-form-ur ...
- 如何使用git 提交作业 收作业
如何使用git 提交作业 收作业 方法论: 今天就来用一个通俗易懂的自然模型来解释Git的commit,pull和push.不过,我们首先要理解两个名词,remote,local. remote,翻译 ...
- Android 开发日常积累
Android 集合 Android 开源项目分类汇总 扔物线的 HenCoder 高级 Android 教程 hencoder HenCoder:给高级 Android 工程师的进阶手册 Andro ...
- python 给文件批量加‘“’ ”,"
file = open('face.txt','r') filew = open('face1.txt','w') try: for line in file: print(line) if line ...
- calcite 理论
https://blog.csdn.net/yunlong34574/article/details/46375733 https://cloud.tencent.com/developer/arti ...
- nginx 并发数问题思考:worker_connections,worker_processes与 max clients
我相信,很多人都跟我一样,看书都不会太细致也不太认真思考,感觉书中讲的东西都应该是对的,最近读书时我发现以前认为理所当然的东西事实上压根都没有弄明白,最终的结果是,书是别人的,书中的知识也是别人的. ...
- [AWS vs Azure] 云计算里AWS和Azure的探究(5) ——EC2和Azure VM磁盘性能分析
云计算里AWS和Azure的探究(5) ——EC2和Azure VM磁盘性能分析 在虚拟机创建完成之后,CPU和内存的配置等等基本上是一目了然的.如果不考虑显卡性能,一台机器最重要的性能瓶颈就是硬盘. ...