[英]typedef'ing an array vs. using a struct in C++
找到了一个有趣的使用typedef,我真的没有看到它的需要。
typedef int Color[3];
那么使用将是:
Color pants;
pants[0] = 0;
etc.
通过ptrs使用typedef创建了一些看起来很奇怪的代码。
为什么不使用结构?
struct Color {
int r;
int g;
int b;
};
Color pants;
pants.r = 0;
etc.
您可以使用联合将变量表示为数组或单独表示,这是不可思议的,但仍然清楚它比单个值更复杂。
有人可以提供有关使用typedef'd数组与结构的优点的见解吗?
可能是结构没有按原编码器想要的方式对齐。 也许它被填充到16或32位。 创建数组可确保不会发生结构填充。 这是传递给驱动程序还是某些硬件设备?
由于几个原因,使用普通数组是一个坏主意。
int[]
类型衰减为int *
。 operator=
来分配数组。 struct
或boost::array
可以更好地满足目的。
结构形式的另一个优点:如果您需要将Color传递给函数然后获取其大小:
void foo (Color c)
{
size_t s = sizeof(c);
}
如果使用数组形式,则c将被解释为Color *
(数组通过指向其第一个元素的指针传递), sizeof(c)
将等于sizeof(int*)
。 去过那里,做到了,被咬了。
编辑:结构形式将表现为(天真)预期。
您希望数组表达式能够循环。
因此,如果您必须拥有[rgb]
表单,则使用union,但这样可以进行更多输入。
::叹::
使用结构数组时,可能的填充可能会成为一个问题,因为您可能会遇到问题,并希望在紧密压缩的RGB之间进行转换。 在这种情况下,请确保填充正是您所期望的,例如使用pragma pack()
。
至于.x或[]是否更好,您可以为结构重载operator[]
(在这种情况下使用开关)。 任何体面的编译器都会将其优化为等于static_cast<int*>(this)[index]
,因此不存在性能损失。 你当然可以选择工会,但这并没有多大帮助。 另一种可能性是在[]方面实现.x()等。
无论如何,我建议使用结构,因为你没有松散任何东西(你仍然可以将Color
数组转换为int*
,但是你可以在获取结构时比使用int*
时更容易编写算法 - 例如,如果你想要亮度,IMAO更容易有一个好的成员/自由函数采用Color而不是int *,因为使用int,你无法确定它是RGB,RGBA,YoCoCg而使用Color,你可以强制执行那。
最后但并非最不重要的是,如果需要,结构使您可以将所有成员初始化为有效/合理/调试值。
我猜这个数组被用作元组,所以boost :: tuple可以被认为是更好地显示意图的替代方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.