c - 该结构在 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;
}
解决方案
我认为,您的示例代码中有趣的地方在于
B = A;
通常,编译器以两种方式之一实现这一点。
(1) 它单独复制成员,或多或少地产生与您所说的完全相同的效果
B.x = A.x;
B.y = A.y;
(2) 它发出一个低级字节复制循环(或机器指令),效果如下
memcpy(&B, &A, sizeof(struct P));
(除了通常这是在线完成的,不涉及实际的函数调用)。
编译器将根据哪个更小(发出的代码更少),哪个更高效,或者编译器试图优化的任何内容来选择其中一个或另一个。
推荐阅读
- asp.net-core - 无头 OrchardCMS - Grapghql 的授权问题
- angular - Angular 9 中的类成员封装
- android - 如何使用 MockK 在 Android 中测试 Kotlin 暂停调用?
- c# - 如何在 ASP.NET Core MVC 中创建具有多个图像的产品
- c - 如何在VSCode的调试器模式下查看指针指向的字符串的char值
- javascript - Typescript 在当前范围内调用 javascript 函数
- c# - 如何在 C# 中将 StorageFile(png 图像)转换为透明的 PNG 位图?
- javascript - jsPlumb 无法正确连接表格内的元素
- python - 如何获取对象的所有属性及其子对象的属性?
- python - 我的 Django 网页没有渲染模型。我该如何解决?