WORD 大小和 C/C++ 变量 - 较小的 Int 大小实际上使用较少的内存吗?

WORD Size and C/C++ Variables - Do Smaller Int Sizes Actually Use Less Memory?

我知道这都是特定于实现的,但是为了举例起见,我们假设对于某台现代计算机:

int占了整个WORD

short占半个WORD

short实际上会占用更少的内存,还是只存储在一个WORD的前半部分而后半部分未使用内存? C/C++ 编译器是否会尝试将两个或更多较小的变量打包到一个 WORD 中,还是这个 space 总是被浪费?

这在很大程度上取决于使用情况。

  1. 您通常可以强制编译器针对 space 进行优化。
  2. 当对象对齐到其大小的倍数的内存边界时(在大多数体系结构上),访问对象的效率会更高。
    因此,编译器可能会注入 space 以获得更好的对齐。
    这通常发生在不同大小的对象需要并排放置时。
  3. 编译器不允许重新排列结构中变量的顺序(如果它们在同一 private/public/protected 部分)。
  4. 我认为本地堆栈帧中的变量排序没有任何要求。因此,编译器应该能够最佳地打包局部变量并最佳地使用所有可用的 space (甚至可能将 space 重新用于 POD 变量,或者永远不要使用 space 如果它可以保留它一个寄存器)。

但是如果你有一个使用相同大小对象的结构。

struct X
{
    short      var1;
    short      var2;
}

那么很可能在上面的结构中没有填充(不能保证,但很可能没有填充)。

由于上面的第 3 点:如果你想帮助你的编译器优化打包一个结构,那么它肯定会让编译器更容易将你的成员从最大到最小排序,因为这使得打包而不需要填充更容易(但标准对填充没有任何要求。

// if we assume sizeof(int) == 8
struct Y
{
    char      x;  // 1 byte;
                  // Compiler will (prob) insert 7 bytes of padding here.
                  // to make sure that y is on an 8 byte boundry
                  // for most effecient reads.
    int       y;
    char      z;  // 1 byte
                  // Compiler will (prob) insert 7 bytes of padding here.
                  // to make sure that the whole structure has a size
                  // that is a multiple of 8 (the largest object)
                  // This allows for optimal packing of arrays of type
                  // Y.
};

如果你这样安排对象,编译器仍然可以实现最佳打包和快速访问:

struct Y
{
    int      y;
    char     x;
    char     z;
    // probably add 6 bytes of padding.
    // So that we get optimal access to objects in an array.
};

for the sake of example let's assume that for a certain modern computer:

如果我们假设在普通标准架构机器上有一个现代的好编译器,比如 clang 或 g++。即使我们假设不优化速度。

Will the short actually take up less memory

是的。现代编译器将尽可能多地打包对象,并且可能只使用所需的内存。注意:大多数编译器默认会针对速度进行优化,因此会保持速度的最佳对齐,因此在必要时会进行填充(如果结构中的对象无法重新排序具有不同的大小)。

or will it just be stored in the first half of a WORD with unused memory in the second half?

不太可能,除非编译器必须维护某些要求。喜欢结构的顺序。

Will a C/C++ compiler ever try to pack two or more smaller variables into a single WORD

是的。每时每刻。默认是通常。 1 优化速度。 2 优化大小(并不总是相互排斥)。您还可以强制现代编译器针对 space 进行优化,并在没有填充的情况下打包结构。

or will this space always be wasted?

不太可能。