读书笔记-----内存模型和名称空间

来源:互联网 发布:美工实例教程 编辑:程序博客网 时间: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》)