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

前端之家收集整理的这篇文章主要介绍了objective-c – 赋值还是memcpy?设置数组成员变量的首选方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于这个例子,我正在使用 objective-c,但欢迎来自更广泛的C/C++社区的答案.
  1. @interface BSWidget : NSObject {
  2. float tre[3];
  3. }
  4. @property(assign) float* tre;

.

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

.

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

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

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

gcc一般会将这些减少到相同的基本操作吗?

谢谢.

解决方法

快速测试似乎表明编译器在优化时会将memcpy调用替换为执行赋值的指令.

反编译以下代码,当未经优化编译并使用-O2时,表明在优化的情况下testMemcpy函数不包含对memcpy的调用.

  1. struct test src = { .a=1,.b='x' };
  2.  
  3. void testMemcpy(void)
  4. {
  5. struct test *dest = malloc(sizeof(struct test));
  6. memcpy(dest,&src,sizeof(struct test));
  7. }
  8.  
  9. void testAssign(void)
  10. {
  11. struct test *dest = malloc(sizeof(struct test));
  12. *dest = src;
  13. }

未经优化的testMemcpy,具有预期的memcpy调用

  1. (gdb) disassemble testMemcpy
  2. Dump of assembler code for function testMemcpy:
  3. 0x08048414 <+0>: push %ebp
  4. 0x08048415 <+1>: mov %esp,%ebp
  5. 0x08048417 <+3>: sub $0x28,%esp
  6. 0x0804841a <+6>: movl $0x8,(%esp)
  7. 0x08048421 <+13>: call 0x8048350 <malloc@plt>
  8. 0x08048426 <+18>: mov %eax,-0xc(%ebp)
  9. 0x08048429 <+21>: movl $0x8,0x8(%esp)
  10. 0x08048431 <+29>: movl $0x804a018,0x4(%esp)
  11. 0x08048439 <+37>: mov -0xc(%ebp),%eax
  12. 0x0804843c <+40>: mov %eax,(%esp)
  13. 0x0804843f <+43>: call 0x8048340 <memcpy@plt>
  14. 0x08048444 <+48>: leave
  15. 0x08048445 <+49>: ret

优化testAssign

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

优化的testMemcpy不包含memcpy调用

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

猜你在找的C&C++相关文章