【问题标题】:How to calculate the total memory requirement for an array of struct in C?如何计算C中结构数组的总内存需求?
【发布时间】:2020-07-18 18:00:09
【问题描述】:

假设一个整数需要4个字节,一个实数需要4个字节,一个字符需要1个 用于分配的内存字节。 考虑以下定义来存储 5 个城市 15 年的每日温度。

struct monYear
{
    int month, year;
};
struct perCity
{
    char cityName[16];
    struct monYear my;
    float temperature[31];
    float avrg;
} fiveCities[5][15];

数组变量 FiveCities 的总内存需求是多少(它需要多少字节 占用内存)?

【问题讨论】:

  • 你试过什么?你认为你做对了吗?每种数据类型的对齐要求是什么?请正确缩进代码。
  • 总内存需求是sizeof fiveCities 的计算结果。
  • 手工计算变量的大小有一些坑。编译器可能会在您的数据结构中添加填充,因为确定变量大小的正确方法是使用 sizeof(..)

标签: c arrays memory struct


【解决方案1】:

您提供的结构很简单,可以很容易地计算为

(16+4+4+31*4+4)*5*15=11400 B

(我假设 int 为 4B,这是特定于架构的)

但是,结构包装并不总是直截了当的,例如,将 cityName 修改为 15 个元素时会生成相同的大小。

这取决于编译器和架构,可以在此处找到有关结构打包的最佳指南之一:

http://www.catb.org/esr/structure-packing/

我们使用 sizeof 运算符来避免结构包装混淆,如下例所示。

#include <stdio.h>

struct monYear {
  int month, year;
};
struct perCity {
  char cityName[15];
  struct monYear my;
  float temperature[31];
  float avrg;
} fiveCities[5][15];

int main(void) {
  printf("%zu\n", sizeof(fiveCities));
  return 0;
}

有一个选项可以强制编译器使用特定的打包大小,例如,gcc 有#pragma pack:

#pragma pack(1)
struct test_structure {
  char byte[1];
  uint32_t dword;
};
#pragma pack()

通常不建议这样做,但在某些情况下可能有用。在上面的示例中,结构大小为 5 字节,而没有 #pragma pack 则为 8。

【讨论】:

    【解决方案2】:

    您可以使用sizeof 运算符。您可以使用等于5*15*sizeof(struct perCity)sizeof(fiveCities)

    【讨论】:

      【解决方案3】:

      作为澄清,sizeof 是一个运算符而不是一个函数,并且在查找值的大小时不需要括号。仅当您想要查找类型的大小(有点像强制转换)时才需要括号。 因此,在您的示例中,您可以通过以下任一方式找到您的尺寸:

      size_t my_size = sizeof fiveCities;
      

      或者你可以使用

      #define CITIES 5
      #define YEARS  15
      size_t storage_needed = sizeof(struct perCity) * CITIES * YEARS;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 2017-07-06
        • 2013-04-21
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多