哪个更具可读性(C++ =)

tot*_*oto 1 c c++

int valueToWrite = 0xFFFFFFFF;
static char buffer2[256];
int* writePosition = (int* ) &buffer2[5];
*writePosition = valueToWrite;

//OR
* ((int*) &buffer2[10] ) = valueToWrite;
Run Code Online (Sandbox Code Playgroud)

现在,我问你们哪一个你觉得更具可读性.涉及临时变量或一步技术的两步技术?

不要担心优化,他们都优化到同一个东西,你可以在这里看到.告诉我哪一个更易读.

or  DWORD PTR ?buffer2@?1??main@@9@4PADA+5, -1
or  DWORD PTR ?buffer2@?1??main@@9@4PADA+10, -1
Run Code Online (Sandbox Code Playgroud)

Art*_*yom 19

int* writePosition = (int* ) &buffer2[5]
Run Code Online (Sandbox Code Playgroud)

要么

*((int*) &buffer2[10] ) = valueToWrite;
Run Code Online (Sandbox Code Playgroud)

这两个都是不正确的,因为在某些平台上访问未对齐的值(+5 +10)可能会花费数百个CPU周期,而在某些平台上(如旧版ARM)则会导致非法操作.

正确的方法是:

memcpy( buffer+5, &valueToWrite, sizeof(valueToWrite));
Run Code Online (Sandbox Code Playgroud)

它更具可读性.

  • 我刚刚测试了memcpy并且它优化为单个MOV,这非常好:)所以,memcpy也是一个很好的解决方案. (5认同)
  • 但是,如果您/知道/您正在使用廉价的未对齐访问的平台上,那么memcpy选项可能会更慢. (2认同)

Ita*_*man 9

将它封装在类中后,使用哪种技术并不重要.方法名称将提供有关代码正在执行的操作的说明.因此,在大多数情况下,您不必深入研究实际的impl.看看发生了什么.

class Buffer
{
    char buffer2[256];
public:
    void write(int pos, int value) { 
       int* writePosition = (int*) &buffer2[pos];
       *writePosition = value;
    }
}
Run Code Online (Sandbox Code Playgroud)