我可以通过创建一个结构体的实例来获取结构体字段的大小吗?

问题描述 投票:31回答:3

如果你有一个结构体的实例,在C++中获取结构体字段的大小是很简单的。 如:(未编译)。

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

// ...

Foo s;
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie

现在我仍然可以做这样的事情,但是我实现的接口(我得到一个BOOL,用来指示一个位域中特定位的状态),我创建结构只是为了得到数据成员的大小。 有没有办法向编译器表明它应该使用结构的字段大小,而不需要创建一个结构的实例? 这就相当于哲学上的。

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.)
}

在堆栈上创建结构应该是又快又便宜的 但我怀疑我这样做会在代码审查中被骂,所以我在寻找一个更好的方法,不会带来额外的维护负担(比如#定义大小)。

c++ sizeof
3个回答
42
投票

你可以使用一个表达式,例如

sizeof Foo().bar

作为参数的 sizeof 不被评估,只评估它的类型,实际上没有创建任何临时性的东西。


如果 Foo 不是默认可构造的(不像你的例子),你必须使用不同的表达式,比如涉及指针的表达式。(感谢Mike Seymour)

sizeof ((Foo*)0)->bar

10
投票
typedef struct Foo { 
    typedef BarType int;
    BarType bar; 
    bool baz; 
} Foo;

...

sizeof(Foo::BarType)

2
投票

你可以用指向结构的指针来使用sizeof of。考虑像下面这样的东西。

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

它的结果是:

163> size.exe
Size of cbar: 1
Size of sbar: 2
Size of bar: 4
Size of baz: 1
Size of llbar: 8
© www.soinside.com 2019 - 2024. All rights reserved.