原文from http://www.learncpp.com/cpp-tutorial/23-variable-sizes-and-the-sizeof-operator/
正如你在基本寻址一节中学到的,现代计算机中的内存是有字节大小的片段组成的,每个片段都有属于自己的唯一的地址。基于这一点,我们可以将内容想象成一系列邮件夹或邮箱,我们可以通过它来放置或获取信息,通过命名的变量来与它们相关联。
但是,这种类比并不总是合理的,很多的变量通常占据不止一个字节的内存。因此,一个独立的变量也许 会使用2,4或8个连续的内存地址。变量使用的内存的大小取决于变量的类型。幸运的是,我们通常通过变量的名字联系内存而不是通过内存的地址,编译器很大程度上隐藏了如何实现不同变量内存块大小的具体细节。
这里有几个理由需要我们知道一个变量到底占据了多大的内存。
1. 一个变量所占据的内存却多,它能够存储的信息量越大。因为每一位都只能存储0或1,我们说一位能够存储2种值。2位能够存储4种值。
bit 0 | bit 1 |
---|---|
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
n位能够存储2^n种值。因为一个字节是8位,一个字节能够存储256种值。
变量的大小限制了它能够存储的信息量。当我们讨论到不同的变量的类型的时候将会详细的强调这个问题。
2. 计算机只有有限的自由内存。每次一声明变量的时候,内存中的一小部分将被使用,知道这个变量被撤销。因为现代计算机有很多的内存空间,这通常不是一个问题,尤其是只声明少量的变量的时候。但是,对于程序而言,通常需要大量的变量,如100000个,使用1字节和8字节变量的差异就会使显著的。
显然下一个问题就是,不同的类型的变量占据了多少的内存呢?给定类型的变量占据内存的大小取决于编译器或是计算机的架构。在大多数32位机中,char为1个字节,一个bool为1个字节,一个short型为2个字节,一个int型为4个字节,一个long型为4个字节,一个float为4个字节,一个double为8个字节。
为了确定一个特殊的机器的不同类型的大小,C++提供了一个sizeof操作符。它是一个一元操作符,能够接受一个类型或是变量,返回以位为单位的大小。可以在你的计算机中运行下列代码:
1: int main()
2: {
3: using namespace std;
4: cout << "bool:\t\t" << sizeof(bool) << " bytes" << endl;
5: cout << "char:\t\t" << sizeof(char) << " bytes" << endl;
6: cout << "wchar_t:\t" << sizeof(wchar_t) << " bytes" << endl;
7: cout << "short:\t\t" << sizeof(short) << " bytes" << endl;
8: cout << "int:\t\t" << sizeof(int) << " bytes" << endl;
9: cout << "long:\t\t" << sizeof(long) << " bytes" << endl;
10: cout << "float:\t\t" << sizeof(float) << " bytes" << endl;
11: cout << "double:\t\t" << sizeof(double) << " bytes" << endl;
12: cout << "long double:\t" << sizeof(long double) << " bytes" << endl;
13: return 0;
14: }
下面是作者Pentium 4机子运行结果
bool: 1 bytes char: 1 bytes wchar_t: 2 bytes short: 2 bytes int: 4 bytes long: 4 bytes float: 4 bytes double: 8 bytes long double: 8 bytes
Interestingly, the sizeof operator is one of only three operators in C++ that is a word instead of a symbol. The other two are new and delete.
这句话意思是不是"能够通过一个词代替一个符号的操作符仅仅有三个,new delete sizeof。"不过具体意思不是很清楚