您的位置:首页 > 其它

2.3 变量大小和sizeof操作符

2012-05-03 14:38 127 查看
原文from http://www.learncpp.com/cpp-tutorial/23-variable-sizes-and-the-sizeof-operator/

正如你在基本寻址一节中学到的,现代计算机中的内存是有字节大小的片段组成的,每个片段都有属于自己的唯一的地址。基于这一点,我们可以将内容想象成一系列邮件夹或邮箱,我们可以通过它来放置或获取信息,通过命名的变量来与它们相关联。

但是,这种类比并不总是合理的,很多的变量通常占据不止一个字节的内存。因此,一个独立的变量也许 会使用2,4或8个连续的内存地址。变量使用的内存的大小取决于变量的类型。幸运的是,我们通常通过变量的名字联系内存而不是通过内存的地址,编译器很大程度上隐藏了如何实现不同变量内存块大小的具体细节。

这里有几个理由需要我们知道一个变量到底占据了多大的内存。

1. 一个变量所占据的内存却多,它能够存储的信息量越大。因为每一位都只能存储0或1,我们说一位能够存储2种值。2位能够存储4种值。

bit 0bit 1
00
01
10
11
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操作符。它是一个一元操作符,能够接受一个类型或是变量,返回以位为单位的大小。可以在你的计算机中运行下列代码:

int main()


{


using namespace std;


cout << "bool:\t\t" << sizeof(bool) << " bytes" << endl;


cout << "char:\t\t" << sizeof(char) << " bytes" << endl;


cout << "wchar_t:\t" << sizeof(wchar_t) << " bytes" << endl;


cout << "short:\t\t" << sizeof(short) << " bytes" << endl;


cout << "int:\t\t" << sizeof(int) << " bytes" << endl;


cout << "long:\t\t" << sizeof(long) << " bytes" << endl;


cout << "float:\t\t" << sizeof(float) << " bytes" << endl;


cout << "double:\t\t" << sizeof(double) << " bytes" << endl;


cout << "long double:\t" << sizeof(long double) << " bytes" << endl;


return 0;


}


下面是作者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。"不过具体意思不是很清楚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: