查看以下代码,该代码将对象分解为单词,以便使用仅接受单词的 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/