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 总是被浪费?
这在很大程度上取决于使用情况。
- 您通常可以强制编译器针对 space 进行优化。
- 当对象对齐到其大小的倍数的内存边界时(在大多数体系结构上),访问对象的效率会更高。
因此,编译器可能会注入 space 以获得更好的对齐。
这通常发生在不同大小的对象需要并排放置时。
- 编译器不允许重新排列结构中变量的顺序(如果它们在同一 private/public/protected 部分)。
- 我认为本地堆栈帧中的变量排序没有任何要求。因此,编译器应该能够最佳地打包局部变量并最佳地使用所有可用的 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?
不太可能。
我知道这都是特定于实现的,但是为了举例起见,我们假设对于某台现代计算机:
int
占了整个WORD
short
占半个WORD
short实际上会占用更少的内存,还是只存储在一个WORD的前半部分而后半部分未使用内存? C/C++ 编译器是否会尝试将两个或更多较小的变量打包到一个 WORD 中,还是这个 space 总是被浪费?
这在很大程度上取决于使用情况。
- 您通常可以强制编译器针对 space 进行优化。
- 当对象对齐到其大小的倍数的内存边界时(在大多数体系结构上),访问对象的效率会更高。
因此,编译器可能会注入 space 以获得更好的对齐。
这通常发生在不同大小的对象需要并排放置时。 - 编译器不允许重新排列结构中变量的顺序(如果它们在同一 private/public/protected 部分)。
- 我认为本地堆栈帧中的变量排序没有任何要求。因此,编译器应该能够最佳地打包局部变量并最佳地使用所有可用的 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?
不太可能。