假设我有以下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;
(这肯定会出错)。如何使用指向第一个成员的单个指针并连续启动/访问所有下一个其他成员?如果您相信某些内容,我也非常感谢您提高绩效的建议。
答案 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的老派作弊一次性复制整个批次。