gpt4 book ai didi

c++ - 编译器通常能够将多个连续的内存拷贝压缩为一个操作吗?

转载 作者:行者123 更新时间:2023-11-28 05:21:15 24 4
gpt4 key购买 nike

类似下面的内容:

struct Vec2
{
int x, y;
};

struct Bounds
{
int left, top, right, bottom;
};

int main()
{
Vec2 topLeft = {5, 5};
Vec2 bottomRight = { 10, 10 };
Bounds bounds;
//___Here is copy operation
//___Note they're not in contiguous order, harder for the compiler?
bounds.left = topLeft.x;
bounds.bottom = bottomRight.y;
bounds.top = topLeft.y;
bounds.right = bottomRight.x;
}

这四个作业可以这样完成:

memcpy(&bounds, &topLeft, sizeof(Vec2));
memcpy(&bounds.right, &bottomRight, sizeof(Vec2));

我想知道两件事:

  1. 编译器通常能够以这种方式进行优化吗?
  2. 四个 int 拷贝是否与两个 int pair 拷贝相同,因为复制内存是 O(n)?

四个拷贝的反汇编结果如下:

bounds.left = topLeft.x;
00007FF642291034 mov dword ptr [bounds],5
bounds.bottom = bottomRight.y;
00007FF64229103C mov dword ptr [rsp+2Ch],0Ah
bounds.top = topLeft.y;
00007FF642291044 mov dword ptr [rsp+24h],5
bounds.right = bottomRight.x;
00007FF64229104C mov dword ptr [rsp+28h],0Ah

令人困惑的是,这两个 memcpy 是第一个和第二个的不同指令,我不明白这一点:

memcpy(&bounds, &topLeft, sizeof(Vec2));
00007FF64229105E mov rbx,qword ptr [topLeft] // This is only one instruction
memcpy(&bounds.right, &bottomRight, sizeof(Vec2));
00007FF642291063 mov rdi,qword ptr [bottomRight] // Compared to 6?
00007FF642291068 mov qword ptr [bounds],rbx
00007FF64229106D mov qword ptr [rsp+28h],rdi
00007FF642291072 jmp main+7Eh (07FF64229107Eh)
00007FF642291074 mov rdi,qword ptr [rsp+28h]
00007FF642291079 mov rbx,qword ptr [bounds]

最佳答案

任何支持线程的现代编译器都必须考虑指令依赖性和重新排序。有了这项技术,它会很快发现您拥有的指令集中没有依赖关系,这意味着它们可以按线性内存顺序重新排序,然后组合。

这并不重要; CPU缓存只会在第一次访问时加载整个缓存行,并在稍后的某个时候刷新整个缓存行。需要时间的是这些操作,而不是 CPU 操作本身。

关于c++ - 编译器通常能够将多个连续的内存拷贝压缩为一个操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41456921/

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