【问题标题】:Getting final number of bytes of last member获取最后一个成员的最终字节数
【发布时间】:2009-07-15 19:47:27
【问题描述】:

您好,

使用 offsetof() 宏填充后,我可以找到字段的字节大小。

类似

结构体 { 字符 r ; 字符 [255] ; } ; // 编译器填充后 r 的字节大小将是 int lenR = offsetof(a, s) - offsetof(a, r);

但是我怎样才能找到结构的最后一个字段的字节大小呢?

【问题讨论】:

    标签: c


    【解决方案1】:

    怎么样:

    int lenS = sizeof(a) - offsetof(a, s);
    

    【讨论】:

    • Ack,你比我快 20 秒。
    【解决方案2】:

    填充不是特定字段的一部分,它是结构本身的一部分。如果我有这样的结构

    struct foo {
       T1 v1;
             // <--- some padding here (A)
       T2 v2;
             // <--- some padding here (B)
       T3 v3;
    };
    

    A 是 v1 的填充部分吗? v2?。 B 是 v2 的一部分吗? v3?如果您担心填充会弄乱诸如将结构持久化到文件或类似的事情,大多数(全部?)编译器都有一种机制来禁用结构填充,即使是在逐个结构的基础上也是如此。要找出结构的最后一个成员的大小,在本例中为 s,请使用 sizeof,例如

     struct a tmp;
     size_t size = sizeof(tmp.s);
    

    如果您不想创建临时文件,您可以利用 sizeof 在编译时发生并且在运行时不执行任何操作的事实,并执行以下操作:

     namespace {
       const a& dummy_func();
     }
     size_t size = sizeof(dummy_func().s);
    

    虚拟函数永远不需要实现。

    另一种选择是

    struct a {
       ...
       typedef char s_type[255];
       s_type s;
    };
    size_t size = sizeof(a::s_type);
    

    【讨论】:

      【解决方案3】:

      我相信你的结构的第一个元素的大小总是等于sizeof(char),你的结构的第二个元素的大小将是sizeof(char[255])。编译器决定插入的任何填充都取决于编译器,并且该内存不属于您。换句话说,该内存是您的应用程序的禁区,任何使用它的尝试都可能导致未定义的行为。也就是说,您仍然可以使用sizeof(struct a) 找到(并且经常需要)结构的总大小。因此,字段的大小正是您所期望的,并且填充不计入各个字段,即使它确实增加了结构的整体大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-22
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 2014-05-09
        • 2012-12-22
        • 1970-01-01
        • 2013-06-13
        相关资源
        最近更新 更多