【发布时间】:2019-12-19 12:06:04
【问题描述】:
这个问题是关于如何控制或优化或删除或释放联合中未使用的内存?我们知道联合大小是联合内部去缩放的最大数据类型。假设我声明了 long 类型,那么它分配了 64 字节的内存,但我在程序中只使用了 16 字节。如何优化剩余的 48 字节内存?
#include<stdio.h>
int main(){
union data_type {
unsigned long A;
unsigned int B;
unsigned short C;
unsigned char D;
};
union data_type my_union;
my_union.C = 0X09;
printf("UNION size:%d\n", sizeof(my_union));
return 0;
}
【问题讨论】:
-
你是怎么做到的,不使用联合,只使用你需要的。
-
类型/变量的大小在编译时确定。您不能在运行时更改大小。但是,仅仅因为您的程序打印 8 并不意味着在
main()中实际使用了 8 个字节的内存。检查反汇编并对优化器有一定的信心。总的来说,目前还不清楚你为什么关心这个(或者更确切地说,为什么你认为你必须关心)。你真正想解决什么问题? -
我认为您的意思是 64 位内存,考虑到
long在某些平台上可能是 64 位(而在其他平台上可能是 32 位)。 -
请注意,
std::any将根据所包含的类型使用或多或少(动态分配的)内存(但std::any的实例仍将始终具有相同的大小)。但是这样做的开销可能意味着它无法解决您遇到的任何问题。 -
另一方面,您的程序中有未定义的行为。以十进制表示形式打印
size_t(sizeof运算符返回的内容)的正确printf格式说明符是%zu。格式说明符和参数类型不匹配会导致 UB。