gpt4 book ai didi

c++ - GCC 和 Clang 是否优化逐字段结构复制?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:09 25 4
gpt4 key购买 nike

例如给予

typedef struct A {
int a;
int b;
int c;
} A;

typedef struct B {
int d;
int e;
int f;
} B;

void f(B& b1, A& a2) {
b1.d = a2.a;
b1.e = a2.b;
b1.f = a2.c;
}

f 可以替换为 memcpy(特别是如果结构有更多字段)。

  1. 两个版本会产生相同的代码吗?

  2. 如果我们复制到的结构的字段少于 A 怎么办?即

    typedef struct C {
    int g;
    int h;
    } C;

    void h(C& c1, A& a2) {
    c1.g = a2.a;
    c1.h = a2.b;
    }

我很感兴趣,因为我生成的代码包括这样的结构拷贝,通常会更改字段的顺序,我想知道是否应该对这些情况进行特殊处理。

包含 C 标记是因为我希望 C 中的行为是相同的(取模指针而不是引用)。

最佳答案

根据 godbolt.org,带有 -O2 的 x86-64 gcc 6.2 产生

mov eax, DWORD PTR [rsi]
mov DWORD PTR [rdi], eax
mov eax, DWORD PTR [rsi+4]
mov DWORD PTR [rdi+4], eax
mov eax, DWORD PTR [rsi+8]
mov DWORD PTR [rdi+8], eax

对于逐个字段的复制,

mov rax, QWORD PTR [rsi]
mov QWORD PTR [rdi], rax
mov eax, DWORD PTR [rsi+8]
mov DWORD PTR [rdi+8], eax

用于 memcpy。 clang 和 icc 都有相似的区别。有点失望。

关于c++ - GCC 和 Clang 是否优化逐字段结构复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41061378/

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