【问题标题】:How to control or optimize or remove or deallocate unused memory in UNION's如何控制或优化或删除或释放 UNION 中未使用的内存
【发布时间】: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_tsizeof 运算符返回的内容)的正确 printf 格式说明符是 %zu。格式说明符和参数类型不匹配会导致 UB。

标签: c++ c gcc gcc4 gcc4.7


【解决方案1】:

您无法优化或删除该内存。如果您像这样使用union,它将继续浪费空间并且您无能为力。这就是为什么使用union 创建“变体”数据类型被认为是不好的做法的原因之一:你最终会浪费内存。

如果您希望在 C 中进行泛型编程,有几种更好的方法:结合枚举类型信息的 void 指针,或适应 C11 的代码_Generic 等。

【讨论】:

    【解决方案2】:

    如果删除成员 A 和 B,则联合的大小将是 unsigned short 的大小,从而最大限度地减少使用的内存量。鉴于程序中只使用了成员 C,这应该不是问题。

    附: %dsize_t 的错误格式说明符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 2015-10-15
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多