如何一次访问连续的struct位字段成员?

时间:2018-04-02 04:54:29

标签: c memory struct bit

假设我有以下pixel_t结构:

big O

我们可以看到它是32位RBG颜色结构。现在假设我有两个结构实例 struct pixel_t{ unsigned short red : 8 ; unsigned short green : 8 ; unsigned short blue : 8 ; unsigned short unused : 8 ; }; 。我正在做以下操作:

struct pixel_t *src; struct pixel_t *dst;

我正在尝试通过循环展开,删除内存别名和执行代码运动来优化此操作。正如我正在做的那样,我正在以下列方式访问struct成员:

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;
 }
}

但是,我没有注意到任何重大的表现回报。然后我意识到结构是32位大小,每个成员都有一个8位字段大小。它应该连续,没有任何填充对齐,因为它们是4的倍数(虽然我不自信)。所以如何如果它们是连续的,我可以通过一次操作访问所有成员吗?我想尝试(*(dst+offset)).red = (*(src+offset)).red; (*(dst+offset)).green = (*(src+offset)).green; (*(dst+offset)).blue = (*(src+offset)).blue; (这肯定会出错)。如何使用指向第一个成员的单个指针并连续启动/访问所有下一个其他成员?如果您相信某些内容,我也非常感谢您提高绩效的建议。

2 个答案:

答案 0 :(得分:3)

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

试试这个:

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

答案 1 :(得分:2)

我宣布一个联盟来访问它们。

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的老派作弊一次性复制整个批次。