首页 > 解决方案 > 该结构在 C 内部如何工作?如何将数据从一个结构复制到另一个结构?

问题描述

好吧,我知道结构在 C 中是如何工作的,但我不知道它在内部是如何工作的,因为我还在学习汇编,我才刚开始,好吧,我的问题是,在下面的代码中,我有一个名为 P 的结构并从名为 A 和 B 的结构中创建两个变量,在将 A 分配给 B 之后,因此 B = A,我可以从 A 获取数据,即使不使用指针,这个数据的副本是如何从A到B制作?

#include <stdio.h>

struct P{
    int x;
    int y;
}A, B;

int main(void) {
   printf("%p\n%p\n\n", &A, &B);
   printf("Member x of a: %p\nMember y of a: %p\n", &A.x, &A.y);
   printf("Member x of b: %p\nMember y of b: %p\n", &B.x, &B.y);  
   A.x = 10;
   A.y = 15;
   B = A; // 10 
   printf("%d\n%d\n", B.x, B.y);
   return 0;
}

标签: cgccassemblyx86x86-64

解决方案


我认为,您的示例代码中有趣的地方在于

B = A;

通常,编译器以两种方式之一实现这一点。

(1) 它单独复制成员,或多或少地产生与您所说的完全相同的效果

B.x = A.x;
B.y = A.y;

(2) 它发出一个低级字节复制循环(或机器指令),效果如下

memcpy(&B, &A, sizeof(struct P));

(除了通常这是在线完成的,不涉及实际的函数调用)。

编译器将根据哪个更小(发出的代码更少),哪个更高效,或者编译器试图优化的任何内容来选择其中一个或另一个。


推荐阅读