在gcc/clang上,long double
使用10个字节,但占用16个字节。如果这个结构体是16个字节,那就好了,但实际上是32个字节,浪费了一半的带宽。
struct {
long double x;
int id;
};
字符串
我尝试union
两个值,但since compiler assumes the whole 16 bytes used only by the long double
, editing it sometimes modifies int
.
有什么好的办法把它们 Package 得很好吗?
2条答案
按热度按时间ymdaylpp1#
在gcc/clang上,
long double
使用10个字节,但占用16个字节。我想你的意思是
long double
的存储大小是16个字节,其中只有10个对它的数值有意义(所以6个是填充的)。这主要是编译器正在构建的目标ABI的属性,而不是编译器本身的属性。
如果这个结构体是16个字节,那就好了,但实际上是32个字节,浪费了一半的带宽。
您是否考虑过使用
double
而不是long double
?在任何情况下,
union
都是C提供两个或多个活动对象具有重叠存储的唯一方式,其中任何对象都不包含另一个对象。这并不能达到同时存储两个重叠值的目的。假设您知道long double
的前10个字节是有效字节,并且int
的大小为4。你可以想象这样做:字符串
但是,
x
的写入只写入10个有效字节而不写入其他字节是不安全的,并且x
然后再写入id
不会导致x
的存储值成为陷阱表示是不安全的也就是说,写入任何一个成员都可能使另一个成员无效。
底线是:如果您想使用更少的存储空间,请使用更小的数据类型(即
double
而不是long double
)。如果您使用的是现在正在使用的数据类型,那么它们的存储占用空间是包的一部分。a5g8bdjr2#
字符串