c - 使用类型双关将对象分解为单词

标签 c language-lawyer strict-aliasing

查看以下代码,该代码将对象分解为单词,以便使用仅接受单词的 API 将(单词对齐的)对象写入内存:

void func(some_type obj /*obj is word aligned*/, unsigned int size_of_obj_in_words)
{
    union punning{
        unsigned char bytes[4]; /* assume 4 bytes in word in my system */
        uint32_t      word;
    };
    union punning pun;
    unsigned char *legal_aliasing_by_char_pointer;
    for (int i=0; i < size_of_obj_in_words; i++)
    {
        for (int j=0; j<4; j++)
        {
            legal_aliasing_by_char_pointer = (unsigned char *)&obj + j + i*4;
            pun.byte[j] = *legal_aliasing_by_char_pointer;
        }
        /* finally, using word aliasing to decompose object to words */
        /* endianity is not important */
        write_word_to_hw_by_word(pun.word)
    }
}   

我正在尝试以符合 c 标准的方式执行它,以便不会违反严格的别名规则。该代码是否实现了该目标?

最佳答案

看起来不错,但你可以简化很多:

void func(some_type obj)
{
    uint32_t word;

    for (int i=0; i < sizeof obj / sizeof word; i++)
    {
        memcpy(&word, (char *)&obj + i * sizeof word, sizeof word);
        write_word(word);
    }
}

obj 的对齐并不重要。此外,您不需要传递大小,因为 sizeof 可以完成这项工作。

我怀疑如果您更改函数以接受对象的地址,它会执行得更好,在这种情况下您可能还想传递一个数组长度。

关于c - 使用类型双关将对象分解为单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57457095/

相关文章:

permissions - C/Unix : How to extract the bits from st_mode?

c++ - 下标时是否必须使用 constexpr 数组?

C++ strict-aliasing agnostic cast

c - 转换 ioctl 参数是否违反严格的别名规则?

c++ - 包含函数调用的并行化循环

c++ - 打包结构/避免填充

c - Strdup() 不工作

c - 我应该采取什么预防措施来制作不调用未定义行为的内存池?

C++17 和十进制浮点的当前状态

c - 为什么没有为此代码生成严格别名警告?