【问题标题】:What is really misaligned pointer?什么是真正未对齐的指针?
【发布时间】:2021-01-18 14:50:18
【问题描述】:

未对齐的指针吓到我了。在解析字符串时,我通常使用的一种有用的技术是将一组字符视为一个单元。

因此,如果我将字符串与

标签: c++ alignment


【解决方案1】:

是的,它几乎肯定是一个未对齐的指针(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 或更好的版本,而且,真的,您应该拥有 :-)

【讨论】:

  • 感谢您的友好回复。我的问题虽然不是速度,但技术使它更容易。但是由于这个对齐问题,Cpp 可能不像我想象的那么有用,而 Java 依赖于复制是正确的。如果不安全,重新解释演员表的目的是什么。为什么我只是在学习指针错位;即使我从未经历过它的愤怒?
  • tobe32 也生成编译时值,而不是在运行时生成。
  • @user13947194,我很好奇你为什么认为它更容易。在我看来,表达式*(unsigned int*)string == tobe32('<!--')match4(string, "<!--") 之间的编码难易程度差别不大。请记住我的第二段。这不一定是问题 - 如果您的目标环境不关心对齐,您也不需要。
  • 请记住,我不是在谈论您的 match4 函数。那很好。我说的是把它作为常规迭代的一部分。定期迭代,弹出角色,测试他们并采取相应的行动。但是我 match4 或者简单的 stringLeftCompriseStringRight 就可以了。
猜你喜欢
  • 2011-05-18
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2021-10-24
  • 2016-02-25
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多