如何一次访问所有连续的结构位域成员?

How to access contiguous struct bit field members all at once?

假设我有以下 pixel_t 结构:

   struct pixel_t{

    unsigned short red : 8 ;
    unsigned short green : 8 ;
    unsigned short blue : 8 ;
    unsigned short unused : 8 ;
    };

可以看出是32位的RBG颜色结构体。现在假设我有两个结构实例 struct pixel_t *src; struct pixel_t *dst;。我正在做以下操作:

for ( int i = 0 ; i < dim ; i ++ ){
for ( int j = 0 ; j < dim ; j ++ ) {
 dst[RIDX ( dim−1−i , dim−1−j , dim ) ].red = src [RIDX ( i , j , dim ) ].red ;
dst[RIDX ( dim−1−i , dim−1−j , dim ) ].green = src [RIDX ( i , j , dim ) ].green ;
dst[RIDX ( dim−1−i , dim−1−j , dim ) ].blue = src [RIDX ( i , j , dim ) ].blue ;
dst [RIDX ( dim−1−i , dim−1−j , dim ) ].unused = src [RIDX ( i , j , dim ) ].unused;
 }
}

我正在尝试通过展开循环、消除内存别名和执行代码移动来优化此操作。在执行这些操作时,我通过以下方式访问结构成员:

(*(dst+offset)).red = (*(src+offset)).red;
(*(dst+offset)).green = (*(src+offset)).green;
(*(dst+offset)).blue = (*(src+offset)).blue;     

但是,我没有注意到任何主要的 return 性能。然后我意识到该结构是 32 位大小并且每个成员都有一个 8 位字段 size.Which 应该使它连续并且没有任何对齐填充,因为它们都是 4 的倍数(尽管我不自信)。那么我如何通过一次操作访问所有成员(如果它们是连续的)?我想尝试 dst[offset].{red,green,blue} (这肯定会出错)。我如何使用指向第一个成员的单个指针并连续 initiate/access 所有相邻的成员?如果你相信你的话,我也很感激任何关于提高性能的建议。

我会声明一个联合来访问它们。

union uPt
{
    struct pixel_t    rgb;
    uint32            dw;
}     ptDemo;

for ( int i = 0 ; i < dim ; i ++ ){
    for ( int j = 0 ; j < dim ; j ++ ) {
         dst[RIDX ( dim−1−i , dim−1−j , dim ) ].ptDemo.dw = src [RIDX ( i , j , dim ) ].dw ;
    }
}

尽管在实践中,我会使用 ::memmove 的 old-school 作弊来一举复制所有内容。

虽然联盟也会。但是对于 C 中的大多数编译器,struct 也是直接复制的。

试试这个:

dst[RIDX ( dim−1−i , dim−1−j , dim ) ] = src [RIDX ( i , j , dim )];