2.3 变量大小和sizeof操作符

原文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。"不过具体意思不是很清楚

你可能感兴趣的:(sizeof)