我有一个inheritance自struct Base的struct X. 但是,在我目前的设置中,由于对齐,X的大小为24B:
typedef struct { double_t a; int8_t b; } Base; typedef struct { Base base; int8_t c; } X;
为了节省内存,我想展开Base结构,所以我创建了包含Base的字段的struct Y(以相同的顺序,总是在struct的开头),所以struct的大小是16B :
typedef struct { double_t base_a; int8_t base_b; int8_t c; } Y;
然后我将在一个方法中使用struct Y的实例,该方法需要一个指向Base结构的指针:
void print_base(Base* b) { printf("%f %dn", b->a, b->b); } // ... Y data; print_base((Base*)&data);
上面的代码是否违反了严格的别名规则,并导致未定义的行为?
首先, Base
和Y
不是标准6.2.7定义的兼容类型,所有成员必须匹配。
要通过Base*
访问Y
而不创建严格的别名冲突, Y
必须是“聚合类型”(它是),其成员中包含Base
类型。 它不是。
因此,它是严格的别名冲突,而且,由于Y
和Base
不兼容,它们可能具有不同的存储器布局。 这就是重点,你为了这个原因制作了不同的类型:)
在这种情况下你可以做的是使用具有共享一个共同初始序列的结构成员的联合,这是一个特殊的允许案例。 来自C11 6.5.2.3的有效代码示例:
需要了解更多c/c++开发分享通过展开inheritance是否违反了严格的别名规则?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
union { struct { int alltypes; } n; struct { int type; int intnode; } ni; struct { int type; double doublenode; } nf; } u; u.nf.type = 1; u.nf.doublenode = 3.14; /* ... */ if (unalltypes == 1) if (sin(u.nf.doublenode) == 0.0)
以上就是c/c++开发分享通过展开inheritance是否违反了严格的别名规则?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979610.html