当最大的成员是整数、浮点类型、_Complex类型、_Atomic类型、数据指针或函数指针而不是数组、structunion*时,是否有可能使union的大小大于最大成员?

例如,是否有(或是否存在)这样的系统,其中以下代码将打印2种不同的大小(假设打印没有失败).如果不是,有没有其他方法可以生成比最大成员更大的union,即使最大成员是"基元类型"**?

#include <complex.h>
#include <stdint.h>
#include <stdio.h>

#define MAX(a,b)       ( (a)>(b) ? (a) : (b) )
#define MAX4(a,b,c,d)  MAX( MAX( (a), (b) ), MAX( (c), (d) ) )

union Foo
{
  uintmax_t a;
  long double f;
  void (*fp)(void);
  void *data;
  double complex c;
};

int main(void)
{
  size_t l = MAX4( sizeof(void*), sizeof(void(*)(void)), sizeof(long double), sizeof(uintmax_t) );
  l = MAX( l, sizeof(double complex) );
  printf( "%zu %zu\n", sizeof(union Foo), l );
}

它(可能)不会改变任何高效的代码,只是出于好奇.


相关但不相同的问题(使用struct内部的union):sizeof union larger than expected. How does type alignment take place here? Size of Union changes with unexpected word alignment

*还有没有其他我忘了的类型?

**这些类型是否有合适的名称?

推荐答案

有没有其他方法可以生成比最大成员更大的联合,即使最大成员是"基元类型"?

可以,您可以使用_Alignas:

union Foo {
    _Alignas(32) uintmax_t a;
    long double f;
    void (*fp)(void);
    void *data;
    double complex c;
};

//

printf("%zu\n", sizeof(union Foo)); // 32

Demo

C++相关问答推荐

初始化char数组-用于初始化数组的字符串是否除了存储数组的位置之外单独存储在内存中

与unions 的未定义行为

如何在c++中包装返回空*的函数

理解C版宏(看起来像未声明的变量?)

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

如何在POSIX-UEFI中获得输入?

使用TCL C API导航到列表中的元素

在C中包装两个数组?

处理来自浏览器的HTTP请求

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

我在C中运行和调试时得到了不同的输出

具有正确标头的C struct 定义问题

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

我错误地修复了一个错误,想了解原因

将数组中的所有元素初始化为 struct 中的相同值

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

如何修复数组数据与列标题未对齐的问题?

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

如何确定 C 程序中的可用堆内存