While playing with C# I came across to this "strange behavior".
The function
public static Vec3 f()
{
var v = new Vec3();
v.x = 0;
v.y = 0;
v.z = 0;
v.x = 0;
v.y = 0;
v.z = 0;
v.x = 0;
v.y = 0;
v.z = 0;
return v;
}
When you use the class keyword for Vec3 then the asm output produces redundant code:
public class Vec3
{
public int x;
public int y;
public int z;
}
asm
C.f()
L0000: sub rsp, 0x28
L0004: mov rcx, 0x7ff7aaa5d040
L000e: call 0x00007ff801dba370
L0013: xor edx, edx
L0015: mov [rax+8], edx
L0018: mov [rax+0xc], edx
L001b: mov [rax+0x10], edx
L001e: mov [rax+8], edx ; isn't this redundant?
L0021: mov [rax+0xc], edx ; isn't this redundant?
L0024: mov [rax+0x10], edx ; isn't this redundant?
L0027: mov [rax+8], edx ; isn't this redundant?
L002a: mov [rax+0xc], edx ; isn't this redundant?
L002d: mov [rax+0x10], edx ; isn't this redundant?
L0030: add rsp, 0x28
L0034: ret
But whit struct keyword we get the following output:
public struct Vec3
{
public int x;
public int y;
public int z;
}
asm
C.f()
L0000: xor eax, eax
L0002: mov [rcx], eax
L0004: mov [rcx+4], eax
L0007: mov [rcx+8], eax
L000a: mov rax, rcx
L000d: ret
Are those assembly lines not redundant? If no, can you please explain me why?
I know that class and struct are NOT the same. The question is about multiple MOV instructions.