C - 是否有更有效的方式来转换" unsigned char数组的项为32位整数值? (共享内存?)

时间:2017-04-21 22:32:51

标签: c arrays shared-memory unions

最近我开始学习C / C ++,而我目前正在深入学习低级编程。我找到了"工会"非常有趣,因为我之前没有看到过这种行为,而是用我所学过的任何语言直接分享记忆。现在我想知道是否有可能通过使用像Union这样的东西来提高这个简单例程的性能,或者通过以某种方式将整数指向数组的特定索引以获得相同的结果如下。

// An Union struct which holds a 32bit integer where every of the 4 bytes can be accessed.
typedef union
{
    struct
    {
        unsigned char BYTE1;
        unsigned char BYTE2;
        unsigned char BYTE3;
        unsigned char BYTE4;
    } BYTES;
    unsigned long VALUE;
} UnionDWORD;

// An array of unsigned chars - representing memory
unsigned char memory[1024]; // reserving 1024 bytes of memory

// Here is where I'm wondering if the "putting together" of the 4 bytes can be improved. (Maybe a pointer to the array?)
// Return 4bytes from memory at the position "pos"
unsigned long getDWordFromMemory(unsigned long pos)
{
    // Making use of the Union struct to put the 4 bytes together
    UnionDWORD result;
    result.BYTES.BYTE4 = memory[pos];
    result.BYTES.BYTE3 = memory[pos+1];
    result.BYTES.BYTE2 = memory[pos+2];
    result.BYTES.BYTE1 = memory[pos+3];

    return result.VALUE;
}

非常感谢,我真的很抱歉我的英语。不幸的是,这不是我的母语。

1 个答案:

答案 0 :(得分:0)

当你拿锤子时,一切看起来像钉子。

假设使用C ++,这是一种更正确的方法,可能是一个坏主意:

unsigned long getDWordFromMemory(size_t pos)
{
    unsigned char* mem = &memory[pos];
    return *reinterpret_cast<unsigned long*>(mem);
}

正如所指出的,上面的对齐问题(你需要确保pos是4的倍数,因为memory[0]将正确对齐)。如果这是一个问题,那么你应该使用这个方法:

unsigned long getDWordFromMemory(size_t pos)
{
    unsigned long value;
    memcpy(&value, &memory[pos], sizeof(value));
    return value;
}

工会可能很有用,但它通常只是用于将不相交的信息打包到较小的内存中。