繁体   English   中英

typedef一个数组与在C ++中使用结构

[英]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=来分配数组。

structboost::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM