读书笔记-----内存模型和名称空间
来源:互联网 发布:美工实例教程 编辑:程序博客网 时间:2024/05/17 09:32
在c++中,有多种方法将数据存储在内存中。可以选择数据在内存中的保留时间(存储持续性)和哪些程序可以访问数据(作用域和链接);可以使用new来动态的分配内存;可以使用名称空间来控制访问权。
c++编译的程序占用的内存可以分为下面几种:
1.栈区,由编译器自动分配和释放,主要存放函数的参数值和局部变量等值。
2.堆区,由new指令申请,delete指令释放,如果申请使用后不是释放,可能会造成内存资源的浪费,对于指针申请的内存空间,指针本身入栈,指针指向的地址存放在堆中。(c++的动态存储持续性)
3.全局和静态变量区,全局和静态变量是存储在一起的,程序开始运行时写入变量值,运行结束前释放变量。
4.程序代码区。用于存放函数体的二进制代码。
在编写程序时,我们喜欢将相同性质的东西放在一起,比如,所有的函数放在一个或者几个独立的文件中,所有的类也放在一个或者几个独立的文件中,在c++中,鼓励程序员这么做,这样程序就便于管理和修改,当我们修改某个函数时,我们只需要将那个函数所在的文件单独编译,然后将它链接这可执行的程序就行了,而不用重新编译所有的文件。
据我了解,一个完整程序的所有文件可以分为几个部分,主函数所在的文件、配置文件、功能函数文件、类文件,我们要在主函数文件中将其他几类文件包涵(#include)进去。
c++中头文件中,最好不要存放函数定义或者变量声明,头文件中通常包含以下内容:函数原型、使用#define或者#const定义的符号常量、结构声明、类声明、模版声明、内联函数。包含文件时,使用双引号和尖括号是有区别的,使用双引号时,编译器将首先在当前工作目录或源代码目录中查找文件,如果没有该文件,再到标准位置查找;使用尖括号时,编译器直接到标准位置查找文件。在同一个文件中中能将同一个头文件包含一次,记得在php中有include_once可以避免包含多次同一个文件,在c++中,可以利用#ifndef避免多次包含同一个头文件。
作用域描述了名称在文件的多大范围可见,链接描述了名称如何在不同单元间共享,链接性为外部的名称可以在文件间共享,链接性为内部的名称只能由一个文件的函数共享。自动变量的名称没有链接性,因此它们不能共享。
在编写程序时,我们要尽量保持对数据的控制性,知道数据从哪里来,要到哪里去,这样的程序才是可靠的。
// twofile1.cpp -- variables with external and internal linkage#include <iostream> // to be compiled with two file2.cppint tom = 3; // external variable definitionint dick = 30; // external variable definitionstatic int harry = 300; // static, internal linkage// function prototypevoid remote_access();int main(){ using namespace std; cout << "main() reports the following addresses:\n"; cout << &tom << " = &tom, " << &dick << " = &dick, "; cout << &harry << " = &harry\n"; remote_access(); return 0; }
// twofile2.cpp -- variables with internal and external linkage#include <iostream>extern int tom; // tom defined elsewherestatic int dick = 10; // overrides external dickint harry = 200; // external variable definition, // no conflict with twofile1 harryvoid remote_access(){ using namespace std; cout << "remote_access() reports the following addresses:\n"; cout << &tom << " = &tom, " << &dick << " = &dick, "; cout << &harry << " = &harry\n";}
最开始,我直接将towfile1.cpp编译,然后build总是出现错误
twofile1.obj : error LNK2001: unresolved external symbol "void __cdecl remote_access(void)" (?remote_access@@YAXXZ)
Debug/twofile1.exe : fatal error LNK1120: 1 unresolved externals
最后发现要把twofile1.cpp和twofile2.cpp先后编译后,才能将twofile1.cpp build。
又碰到了一个问题,执行时出现了LINK : fatal error LNK1104: cannot open file "Debug/static.exe",最后发现是我之前调试这个程序的时候,没有关执行窗口,关掉执行窗口,再编译,链接,运行,成功了。
char input[ArSize] ,cin.get(input, ArSize),input中实际只能存储ArSize-1个字符;
(ps:来自《c++ primer plus》)
- 读书笔记-----内存模型和名称空间
- 内存模型和名称空间
- 内存模型和名称空间
- 内存模型和名称空间
- 内存模型和名称空间
- 第九章 内存模型和名称空间
- C++内存模型和名称空间
- C++Primer内存模型和名称空间
- C++内存模型和名称空间总结
- 第九章 内存模型和名称空间
- 第九章 内存模型和名称空间
- C++ 内存模型和名称空间
- 第九章:内存模型和名称空间
- 【读书笔记:C++ primer plus 第六版 中文版】第9章 内存模型和名称空间
- C++学习(十)内存模型和名称空间
- 第9章——内存模型和名称空间
- 第十天(内存模型和名称空间)
- 【c++ primer】第九章 内存模型和名称空间
- Hadoop Counters
- C++基础知识拾遗
- 把java代码转换成exe
- jxl导出EXCEL
- ASP.NET获取客户端及服务器的信息
- 读书笔记-----内存模型和名称空间
- 游标介绍
- 【技巧】UE使用技巧
- HDU 1019 Least Common Multiple
- Linux下AT&T语法同Intel语法区别
- Windows核心编程1
- YII Framework学习教程-YII的Model-数据库操作5-数据迁移官方翻译
- oracle 调用Java 实现ftp文件的上传和下载 问题
- 正则表达式详解