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)
它更具可读性.
将它封装在类中后,使用哪种技术并不重要.方法名称将提供有关代码正在执行的操作的说明.因此,在大多数情况下,您不必深入研究实际的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)