是否有可能找出 C 联合的最小大小

Is it possible to find out the smallest size of a C union

C 联合 (sizeof()) 的大小是其最大元素的大小。

但是,是否有任何技巧可以通过编程找出联合的最小大小?

我的意思是关于 offsetof MACRO 的实现方式...

我看到有 2 种方法可以回答这个问题:

  1. 每个并集只有一个尺寸,所以这也是它的最小尺寸。
  2. 如果您真正想要的是构成并集的元素的最小大小,那么单独计算每个元素的大小并取其中的最小值。

如果我没理解错的话,您想在不声明该类型的变量且不引用该成员的类型的情况下找到联合类型的最小成员的大小。以下获取成员大小的技巧可能会奏效,但有点狡猾:

#define membersize(type, member) sizeof(((type *)0)->member)

您必须分别计算每个成员的大小以确定哪个成员最小,因此如果有人向联合体添加新成员,您必须将确定最小成员大小的代码更改为占它。

仅作为练习:

  1. 为您的工会成员使用特定模式
  2. 每次更新联合时注意更新代码 成员
  3. 使用变量跟踪每个成员的结尾

你可以像下面那样做

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <inttypes.h>

struct s1
{
    uint8_t member;
    uint8_t len;
};

struct s2
{
    uint16_t member;
    uint8_t len;
};

struct s3
{
    uint32_t member;
    uint8_t len;
};

typedef union u1
{
    struct s1 m1;
    struct s2 m2;
    struct s3 m3;
}UNION_TEST;

#define RETRIEVE_MEMBER(memberNum) m##memberNum
#define test(unionName, memberName) offsetof(unionName, memberName.len)+sizeof(uint8_t)

int main(void)
{
   printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(1)));
   printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(2)));
   printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(3)));
}