我可以获得结构字段的大小而不创建结构的实例吗?

Gre*_*g D 29 c++ sizeof

如果你有一个struct的实例,那么在C++中获取struct字段的大小是微不足道的.例如(未编译):

typedef struct Foo {
    int bar;
    bool baz;
} Foo;

// ...

Foo s;
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie
Run Code Online (Sandbox Code Playgroud)

现在我仍然可以做这样的事情,但是我正在实现的接口(我得到一个BOOL,指示一个位域中特定位的状态应该是什么),我只是创建结构来获得大小数据成员.有没有办法向编译器指示它应该使用struct字段的大小而不创建struct的实例?这将是哲学上的等价物:

SetBit(bool val) {
    StoreInSomething(
        BITFIELD_POSITION_CONSTANT, // position of bit being set
        val,                        // true = 1, false = 0
        sizeof(Foo::bar));          // This is, of course, illegal.  (The method I've been told I must use req's the size of the target field.)
}
Run Code Online (Sandbox Code Playgroud)

在堆栈上创建结构应该快速且便宜,但我怀疑在代码审查中我会得到它,所以我正在寻找一种更好的方法,不会引入额外的维护负担(例如#defines for sizes).

CB *_*ley 40

您可以使用如下表达式:

sizeof Foo().bar
Run Code Online (Sandbox Code Playgroud)

由于sizeof没有评估参数,只有它的类型,实际上没有创建临时.

编辑

如果Foo不是默认构造(与您的示例不同),则必须使用不同的表达式,例如涉及指针的表达式.(感谢Mike Seymour)

sizeof ((Foo*)0)->bar
Run Code Online (Sandbox Code Playgroud)

  • 只要`Foo`是默认的可构造的.否则,你需要一些伪构造函数参数,或者`sizeof((Foo*)0) - > bar`.@Dan:指针版本也适用于C语言. (7认同)
  • @John Dibling:我的也是,到处都是灰质。. . *显然在我的情况下并不多* (2认同)

Bin*_*ier 10

typedef struct Foo { 
    typedef BarType int;
    BarType bar; 
    bool baz; 
} Foo;
Run Code Online (Sandbox Code Playgroud)

...

sizeof(Foo::BarType)
Run Code Online (Sandbox Code Playgroud)


Joh*_*cha 6

您可以将 sizeof 与指向结构的指针一起使用。考虑如下:

#include <stdio.h>

typedef struct Foo {
    char         cbar;
    short        sbar;
    int          bar;
    bool         baz;
    long long    llbar;
} Foo;




int main (void)
{
    struct Foo    *p_foo = 0;

    printf("Size of cbar: %d\n", sizeof(p_foo->cbar));
    printf("Size of sbar: %d\n", sizeof(p_foo->sbar));
    printf("Size of bar: %d\n", sizeof(p_foo->bar));
    printf("Size of baz: %d\n", sizeof(p_foo->baz));
    printf("Size of llbar: %d\n", sizeof(p_foo->llbar));
}
Run Code Online (Sandbox Code Playgroud)

给出的结果如下:

163> size.exe
Size of cbar: 1
Size of sbar: 2
Size of bar: 4
Size of baz: 1
Size of llbar: 8
Run Code Online (Sandbox Code Playgroud)