gpt4 book ai didi

objective-c - 赋值还是 memcpy?设置数组成员变量的首选方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 03:42:03 26 4
gpt4 key购买 nike

对于这个例子,我使用的是 objective-c,但欢迎来自更广泛的 C/C++ 社区的回答。

@interface BSWidget : NSObject {
float tre[3];
}
@property(assign) float* tre;

.

- (void)assignToTre:(float*)triplet {
tre[0] = triplet[0];
tre[1] = triplet[1];
tre[2] = triplet[2];
}

.

- (void)copyToTre:(float*)triplet {
memcpy(tre, triplet, sizeof(tre) );
}

所以在这两种方法之间,并考虑到这些 setter 函数通常只能处理 2,3 或 4 的维度...

对于这种情况,最有效的方法是什么?

gcc 通常会将这些简化为相同的基本操作吗?

谢谢。

最佳答案

快速测试似乎表明编译器在优化时用执行分配的指令替换了 memcpy 调用。

反汇编以下代码,在未优化且使用 -O2 编译时,显示在优化情况下,testMemcpy 函数不包含对 memcpy 的调用。

struct test src = { .a=1, .b='x' };

void testMemcpy(void)
{
struct test *dest = malloc(sizeof(struct test));
memcpy(dest, &src, sizeof(struct test));
}

void testAssign(void)
{
struct test *dest = malloc(sizeof(struct test));
*dest = src;
}

未优化的 testMemcpy,按预期调用 memcpy
(gdb) disassemble testMemcpy 
Dump of assembler code for function testMemcpy:
0x08048414 <+0>: push %ebp
0x08048415 <+1>: mov %esp,%ebp
0x08048417 <+3>: sub $0x28,%esp
0x0804841a <+6>: movl $0x8,(%esp)
0x08048421 <+13>: call 0x8048350 <malloc@plt>
0x08048426 <+18>: mov %eax,-0xc(%ebp)
0x08048429 <+21>: movl $0x8,0x8(%esp)
0x08048431 <+29>: movl $0x804a018,0x4(%esp)
0x08048439 <+37>: mov -0xc(%ebp),%eax
0x0804843c <+40>: mov %eax,(%esp)
0x0804843f <+43>: call 0x8048340 <memcpy@plt>
0x08048444 <+48>: leave
0x08048445 <+49>: ret

优化的testAssign

(gdb) disassemble testAssign 
Dump of assembler code for function testAssign:
0x080483f0 <+0>: push %ebp
0x080483f1 <+1>: mov %esp,%ebp
0x080483f3 <+3>: sub $0x18,%esp
0x080483f6 <+6>: movl $0x8,(%esp)
0x080483fd <+13>: call 0x804831c <malloc@plt>
0x08048402 <+18>: mov 0x804a014,%edx
0x08048408 <+24>: mov 0x804a018,%ecx
0x0804840e <+30>: mov %edx,(%eax)
0x08048410 <+32>: mov %ecx,0x4(%eax)
0x08048413 <+35>: leave
0x08048414 <+36>: ret

优化的 testMemcpy 不包含 memcpy 调用

(gdb) disassemble testMemcpy 
Dump of assembler code for function testMemcpy:
0x08048420 <+0>: push %ebp
0x08048421 <+1>: mov %esp,%ebp
0x08048423 <+3>: sub $0x18,%esp
0x08048426 <+6>: movl $0x8,(%esp)
0x0804842d <+13>: call 0x804831c <malloc@plt>
0x08048432 <+18>: mov 0x804a014,%edx
0x08048438 <+24>: mov 0x804a018,%ecx
0x0804843e <+30>: mov %edx,(%eax)
0x08048440 <+32>: mov %ecx,0x4(%eax)
0x08048443 <+35>: leave
0x08048444 <+36>: ret

关于objective-c - 赋值还是 memcpy?设置数组成员变量的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112289/

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