Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以获取不创建结构实例的结构字段的大小? < >如果C++中有结构实例,那么在C++中获取结构域的大小是微不足道的。例如(未编译):_C++_Sizeof - Fatal编程技术网

我是否可以获取不创建结构实例的结构字段的大小? < >如果C++中有结构实例,那么在C++中获取结构域的大小是微不足道的。例如(未编译):

我是否可以获取不创建结构实例的结构字段的大小? < >如果C++中有结构实例,那么在C++中获取结构域的大小是微不足道的。例如(未编译):,c++,sizeof,C++,Sizeof,现在我仍然可以做类似的事情,但是使用我正在实现的接口(我得到一个BOOL,它指示位字段中特定位的状态应该是什么),我创建结构只是为了获得数据成员的大小。有没有一种方法可以向编译器指示它应该使用结构字段的大小,而不创建结构实例?这在哲学上等同于: SetBit(bool val) { StoreInSomething( BITFIELD_POSITION_CONSTANT, // position of bit being set val,

现在我仍然可以做类似的事情,但是使用我正在实现的接口(我得到一个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.)
}
在堆栈上创建结构应该既快又便宜,但我怀疑我会在代码审查中对此感到不满,所以我正在寻找一种更好的方法,它不会引入额外的维护负担(例如#定义大小)


可以使用以下表达式:

sizeof Foo().bar
由于未计算
sizeof
的参数,因此只会创建其类型,而不会实际创建临时变量


如果
Foo
不是默认可构造的(与您的示例不同),则必须使用不同的表达式,例如包含指针的表达式。(感谢迈克·西摩)


可以将的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));
}

只要
Foo
是默认可构造的。否则,您将需要一些伪构造函数参数,或者
sizeof((Foo*)0)->bar
@丹:指针版本也可以用C语言。这就是质量。:)正是我要找的@约翰·迪柏林:我也是,到处都是灰质。很明显,我的生活中没有太多case@Mike:实际上,我应该知道指针方法会起作用,因为当我想知道成员的大小时,我经常在GDB中使用这个技巧。但是,我从来没有想过用它来编译代码。谢谢
offsetof
宏通常使用类似的(甚至更具大脑爆炸性的)技术来实现。
sizeof(Foo::BarType)
sizeof Foo().bar
sizeof ((Foo*)0)->bar
#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