【问题标题】:Memory space occupied by an array数组占用的内存空间
【发布时间】:2014-11-21 12:12:26
【问题描述】:

这是一个基本问题,但我找不到明确的答案。希望有人可以阐明。

我想知道一个数组占用多少内存空间。

多个不同类型但具有相同组合字节大小的数组是否占用相同数量的内存?

一个数组是否与多个相同大小的数组合并后占用相同的内存空间?

一些例子:

(在我的系统 8051 微控制器上, char = 1 byte; int = 2 bytes ; float = 4 bytes;)

//case 1
char array_nr1[40];

//case 2
char array_nr1[10];
char array_nr2[10]; 
char array_nr3[10]; 
char array_nr4[10]; 

//case 3 
int array_nr1[10];
int array_nr2[10]; 

//case 4
float array_nr1[10];

//case 5 
char array_nr1[10];
int array_nr2[5];
float array_nr3[5];

是否所有 5 个案例都占用相同数量的内存(40 字节)?是否有任何其他数据存储在内存中(例如数组基地址)

谢谢。

【问题讨论】:

  • 没有paddingoptimizationpacking,理论上是可以的。
  • “一案”“取内存”是什么意思?每个对象都需要内存,如果它有存储空间,但是否需要任何内存取决于你做什么。如果从不引用该对象,编译器可能会选择不为其分配任何存储空间。您可以询问的唯一明智的事情是每个对象的 size
  • 您确定您的计算正确吗? int 通常占用 4 字节空间,因此每个 10 int 的两个数组将占用 80 字节,而不是 40
  • @SouravGhosh: sizeof(int) 在所有平台上不一定都是 4 个字节。
  • @barakmanos 我指的是 OP 提供的char = 1 byte ; int = 2 bytes ; float = 4 bytes

标签: c arrays memory


【解决方案1】:

数组占用的内存可以通过sizeof操作符获取。例如

char array_nr1[40];

printf( "%zu\n", sizeof( array_nr1 ) );

输出将是 40,因为 sizeof( char ) 即数组元素的大小保证等于 1

你可以为数组写同样的例子

int array_nr1[10];

但最好通过将其元素的 sizeof 乘以元素的数量来计算数组的大小。

所以这个记录

sizeof( array_nr1 )

等价于

10 * sizeof( int )

所以问题是 int 类型的对象的大小是多少?这取决于实施。例如 sizeof( int ) 可以等于 2 或 4 或其他值。

所以在你的情况下,如果 sizeof( int ) 等于 2 那么这两个数组

int array_nr1[10];
int array_nr2[10]; 

占用2 * ( 10 * sizeof( int ) ) => 40 字节。就是数组占用的内存量是一样的

char array_nr1[40];

如果 sizeof( int ) 等于 4,则数组占用不同的内存量。

同样的观察对于浮点类型的数组也是有效的。通常 float 类型的对象的字节大小等于 4。所以如果 sizeof( int ) 等于 2 那么这些数组

char array_nr1[10];
int array_nr2[5];
float array_nr3[5];

占用和数组一样多的内存

char array_nr1[40];

因为

10 * sizeof( char ) + 5 * sizeof( int ) + 5 * sizeof( float ) => 10 * 1 + 5 * 2 + 5 * 4 => 40 字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2022-08-05
    • 1970-01-01
    • 2012-10-30
    • 2021-02-27
    • 2012-05-23
    • 2018-06-12
    • 2014-11-10
    相关资源
    最近更新 更多