当前位置:  开发笔记 > 编程语言 > 正文

C++联合数组和变量?

如何解决《C++联合数组和变量?》经验,为你挑选了3个好方法。

在C++中有没有办法做这样的事情?

union {
    {
        Scalar x, y;
    }
    Scalar v[2];
};

哪里x == v[0]y == v[1]



1> Brian R. Bon..:

由于您使用的是C++而不是C,并且因为它们属于相同的类型,为什么不将xa引用到v [0]并且引用v [1]


+1.这很好地解决了v [1]不能保证C++语言规则与y对应的事实.

2> fido..:

怎么样

union {
    struct {
        int x;
        int y;
    };
    int v[2];
};

编辑:

union a {
    struct b { int first, second; } bee;
    int v[2];
};

丑陋,但更准确


至少,请添加offsetof(v [1])== offsetof(y)的编译时断言(使用例如BOOST_STATIC_ASSERT).在大多数编译器/平台上都会出现这种情况,但确保它永远不会受到伤害.
根据x,y和z的类型,以及您正在使用的特定编译器,甚至是目标平台,您可能会看到由数据对齐引起的问题.本质上,x和y可能不一定与v [0]和v [1]直接对应地驻留在存储器中.
+1约翰瓦茨.C++保证数组的元素是连续布局的,但只能保证POD结构元素的地址大于所有先前声明的元素的地址(即布局结构的灵活性更大).

3> Martin York..:

试试这个:

template
struct U1
{
    U1();
    T   v[2];
    T&  x;
    T&  y;
};

template
U1::U1()
    :x(v[0])
    ,y(v[1])
{}

int main()
{
    U1   data;

    data.x  = 1;
    data.y  = 2;
}


我说的是,对于本质上提供对两个数据的访问的东西,结果的结构在很大程度上通过保持两个额外的指针来扩展......在某些情况下这可能是可接受的,而在其他情况下是不可接受的.向那些看着这个解决方案的人发出警告.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有