C/C++中原子类型占用的空间大小


在C/C++中,基本数据类型占用的字节数(用sizeof(type)得到),在不同平台、不同编译器下可能是不同的,不像Java那样有统一的标准。长期以来我对这些具体数值并不是非常清楚,因此决定花些时间整理一下。测试使用的测试代码很简单:

/* data_size.c */
#include <stdio.h>

int main()
{
  // NOTE: should use the format string "%u" when compiled with TurboC
  // NOTE: VC6 does not support "long long"
  printf("sizeof(char): %zd, sizeof(short): %zd, sizeof(int): %zd\n", sizeof(char), sizeof(short), sizeof(int));
  printf("sizeof(long): %zd, sizeof(long long): %zd, sizeof(void *): %zd\n", sizeof(long), sizeof(long long), sizeof(void *));
  printf("sizeof(float): %zd, sizeof(double): %zd, sizeof(long double): %zd\n", sizeof(float), sizeof(double), sizeof(long double));

  return 0;
}

由于手头资源有限,而且长期没在Windows下编程,因此在Windows平台下并没有使用最新的Visual Studio,而是仅测试了VC6.0和TurboC3.0,以下是测试结果:

  char short int long long long void * float double long double
TurboC 3.0 1 2 2 4 4 2 4 8 10
Visual C++ 6.0 1 2 4 4 4 4 8 8
gcc(WinXP 32bit) 1 2 4 4 8 4 4 8 12
gcc(Linux x86_64 4.8.2) 1 2 4 8 8 8 4 8 16
gcc(Linux x86_64 4.8.2 use -m32 flag) 1 2 4 4 8 4 4 8 12
clang(OSX x86_64 503.0.40) 1 2 4 8 8 8 4 8 16

从上面测试的情况,可以得出以下结论:

  1. 不同编译器的默认字长不同,与操作系统以及硬件字长无绝对关系(如在32位的WinXP下TurboC的字长却为2)
  2. 一般情况下,long类型占用的字节数为机器字长(TurboC例外)
  3. 指针类型占用的字节数始终与编译器字长一致
  4. 除了VC6外,各编译器都提供了高于双精度的浮点类型long double(在x86架构中,实际使用80位,即10个字节,参见[[ia32-fp]])。出于效率考虑,该类型占用的字节数要与字长对齐,因而字长为2时,占用10字节;字长为4时,占用12字节;字长为8时,占用16字节。

Author: Rex Shen

Created: 2014-07-17 Thu 12:47

Emacs 24.3.1 (Org mode 8.2.7b)

Validate

Leave a comment

Your email address will not be published. Required fields are marked *