C++ 什么是真正的未对齐指针?

C++ 什么是真正的未对齐指针?,c++,alignment,C++,Alignment,指针错位吓坏了我。解析字符串时,我通常使用的一种有用技术是将一组字符作为一个单元处理 因此,如果我将一个字符串与whereYes进行比较,它几乎肯定是一个未对齐的指针(a),转换地址实际上不应该更改地址,只需要更改取消引用它时它的处理方式 然而,这不一定是个问题。如果您这样做,某些环境实际上可能会引发硬件异常(一些早期的ARM,来自内存),有些环境会运行得稍慢一些(一些x86),毫无疑问,有些环境根本不在乎。因此,这取决于您的底层环境 然而,我真的怀疑这个技巧的必要性,因为事实上你必须做endi

指针错位吓坏了我。解析字符串时,我通常使用的一种有用技术是将一组字符作为一个单元处理


因此,如果我将一个字符串与whereYes进行比较,它几乎肯定是一个未对齐的指针(a),转换地址实际上不应该更改地址,只需要更改取消引用它时它的处理方式

然而,这不一定是个问题。如果您这样做,某些环境实际上可能会引发硬件异常(一些早期的ARM,来自内存),有些环境会运行得稍慢一些(一些x86),毫无疑问,有些环境根本不在乎。因此,这取决于您的底层环境

然而,我真的怀疑这个技巧的必要性,因为事实上你必须做endian转换,这意味着它可能没有你想象的那么有效

我的第一个倾向是只写一个内联函数,分别检查四个字符,计时,如果真的有问题,只担心优化。这大概是:

// 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++ <代码>对齐< <代码>表达式,例如<代码>对齐(int)<代码>,假设您有C++ 11或更好,并且,确实,您应该有:- /p>“正如您所看到的,我处理了“种子”问题”——这只是假的…谢谢您的友好响应。我的问题不是速度,但技术让它更容易。但是有了这个对齐问题,Cpp可能不像我想象的那样有用,Java依赖复制是正确的。如果铸件不安全,重新解释铸件的目的是什么。为什么我只是在学习指针未对准;即使我从未经历过它的愤怒,ToBe32也会产生编译时值,而不是在运行时生成。@ USE1394194,我很好奇为什么你认为它更容易。在我看来,表达式

*(unsigned int*)string==tobe32在编码的容易程度上似乎没有什么区别('请记住,我不是说你的match4函数。那很好。我是说作为常规迭代的一部分来做。常规迭代,弹出字符,测试它们并采取相应的行动。但是我匹配4或简单地匹配stringLeftCompriseStringRight就行了。
// 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;
}