代码之家  ›  专栏  ›  技术社区  ›  SPWorley

批准的原始指针操作语法

  •  6
  • SPWorley  · 技术社区  · 16 年前

    我正在做一个内存块复制例程,需要以有效的块处理原始内存块。我的问题不是我正在做的专门的复制例程,而是如何正确地检查C中的原始指针对齐方式。

    我有一个原始的内存指针,假设它已经转换为非空字符*。 在我的体系结构中,当内存与64字节块对齐时,我可以非常高效地复制64字节块中的内存。因此(标准)技巧是,我将在头和/或尾“手动”复制0-63字节,将副本从任意长度的任意字符*转换为长度为64字节倍数的64字节对齐指针。

    现在的问题是,如何合法地“检查”指针以确定(并操纵)其对齐方式?

    char *pointer=something.
    int p=(int)pointer;
    char *alignedPointer=(char *)((p+63)&~63);
    

    注意这里我意识到alignedPointer并不指向与指针相同的内存。。。这是一个“向上舍入”的指针,我可以在上面调用我的高效复制例程,我将在开始时手动处理任何其他字节。

    C理想情况下,使用不同的编译器,我不会得到错误或警告。

    4 回复  |  直到 16 年前
        1
  •  7
  •   Craig McQueen Dr. Watson    16 年前

    对于大到足以容纳指针的整数类型,C99 stdint.h

    typedef 这是给他们的。

        2
  •  1
  •   JustJeff    16 年前

    我不认为在过去人们是不愿意做自己的一点砰砰,但也许目前的“不要碰那”的情绪将有助于有人创造某种标准库对齐指针。由于缺少某种官方api,您别无选择,只能通过和或您的方式。

        3
  •  0
  •   Seva Alekseyev    16 年前

    请尝试保证与指针大小相同的数据类型(Win32/64上的int\PTR),而不是int。也许编译器不会太紧张。:)如果64位兼容性不重要,也可以使用联合。

        4
  •  0
  •   please delete me please delete me    16 年前

    如果所讨论的体系结构能够有效地交换地操作指针和整数,那么问题就在于它是否能在该系统的所有编译器上工作,那么答案是它可能无论如何都能工作。

    (当然,如果我在写这段代码,我会认为它很好,直到证明不是这样。我的经验是,给定系统的编译器在这种级别上的行为方式都非常相似;汇编语言只是提出了一种特定的方法,所有这些方法都需要用到。)

    #ifdef 只有已知的编译器才会编译它,并遵从 memcpy

    #ifdef公司