gpt4 book ai didi

c - 如何一次访问所有连续的结构位字段成员?

转载 作者:行者123 更新时间:2023-12-01 09:27:47 25 4
gpt4 key购买 nike

假设我有以下 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;

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

最佳答案

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

试试这个:

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

关于c - 如何一次访问所有连续的结构位字段成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49605488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com