Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何一次访问所有连续的结构位字段成员?_C_Memory_Struct_Bit - Fatal编程技术网

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

C 如何一次访问所有连续的结构位字段成员?,c,memory,struct,bit,C,Memory,Struct,Bit,假设我有以下像素结构: struct pixel_t{ unsigned short red : 8 ; unsigned short green : 8 ; unsigned short blue : 8 ; unsigned short unused : 8 ; }; 我们可以看到它是32位RBG颜色结构。现在假设我有两个struct实例struct pixel\u t*src;结构像素*dst。我正在做以下操作: for ( int i =

假设我有以下像素结构:

   struct pixel_t{

    unsigned short red : 8 ;
    unsigned short green : 8 ;
    unsigned short blue : 8 ;
    unsigned short unused : 8 ;
    };
我们可以看到它是32位RBG颜色结构。现在假设我有两个struct实例
struct pixel\u t*src;结构像素*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;
 }
}

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

我将声明一个联盟来访问它们

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 ;
    }
}
union uPt
{
结构像素\u t rgb;
uint32 dw;
}ptDemo;
对于(int i=0;i

虽然,在实践中,我会使用老式的::memmove来一次性复制整个文件。

尽管Union也会这样做。但是对于C语言中的大多数编译器来说,结构也是直接复制的

试试这个:

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

在C语言中,只有
:memmove
出现语法错误。那么,memmove。我只是在base前面加了前缀,表示它不是库的成员函数。(还有,习惯的力量)。这不是在大多数编译器上,而是针对每个兼容的编译器。为了便于可读性和理解:1)请始终缩进代码。在每个左大括号“{”之后缩进。在每个右大括号“}之前缩进“。建议每个缩进级别为4个空格8位字段?为什么不直接使用
uint8\u t
?我怀疑
uint8\u t
值可能会执行得更好。几乎所有硬件都有机器指令来有效地处理
char
集和数组,并且编译器对
char
值的优化非常完美。”重新。
dst[RIDX ( dim−1−i , dim−1−j , dim ) ] = src [RIDX ( i , j , dim )];