是否有可能找到C联合的最小尺寸

时间:2016-08-31 14:09:17

标签: c sizeof unions

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

但是,是否有任何技巧可以找出可能是最小规模的联盟?

我的意思是如何实现MACRO的偏移......

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

如果我理解正确,你想要找到一个联合类型的最小成员的大小而不声明该类型的变量,而不参考成员的类型。获得成员大小的以下技巧可能会起作用,但有点狡猾的一面:

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

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

答案 2 :(得分:2)

仅作为练习:

  1. 为工会成员使用特定模式
  2. 每次更新联合时都要更新代码 成员
  3. 使用变量追踪每个成员的结尾
  4. 你可以做类似下面的事情

    #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)));
    }