【发布时间】:2021-01-18 14:50:18
【问题描述】:
未对齐的指针吓到我了。在解析字符串时,我通常使用的一种有用的技术是将一组字符视为一个单元。
因此,如果我将字符串与
未对齐的指针吓到我了。在解析字符串时,我通常使用的一种有用的技术是将一组字符视为一个单元。
因此,如果我将字符串与
是的,它几乎肯定是一个未对齐的指针(a),转换地址实际上不应该更改地址,只需更改取消引用时的处理方式.
不过,这不一定是个问题。如果您这样做,某些环境实际上可能会引发硬件异常(一些早期的 ARM,从内存中),有些会运行得慢一点(一些 x86),毫无疑问,有些根本不会关心。所以这取决于你的底层环境。
但是,我真的怀疑需要这个技巧,因为你必须进行字节序转换意味着它可能没有你想象的那么有效。
我的第一个倾向是只编写一个内联函数,分别检查四个字符,计时,如果有真正的问题,只担心优化。就像这样:
// Check first four characters match. Pre-condition is that both
// legacy-C-strings are at least four characters in length.
inline bool match4(const char *str, const char *match) {
if (*str++ != *match++) return false;
if (*str++ != *match++) return false;
if (*str++ != *match++) return false;
return *str == *match;
}
这将是我的起始位置,而不是依赖使用强制转换的可能不可移植的解决方案。
(a)如果你想知道某些类型的对齐要求,你可以使用C++的alignof表达式,比如alignof(int),假设你拥有 C++11 或更好的版本,而且,真的,您应该拥有 :-)
【讨论】:
*(unsigned int*)string == tobe32('<!--') 和match4(string, "<!--") 之间的编码难易程度差别不大。请记住我的第二段。这不一定是问题 - 如果您的目标环境不关心对齐,您也不需要。