【发布时间】:2014-06-20 07:28:45
【问题描述】:
我正在尝试创建一个功能类似于 memcpy() 的函数 InvertCopy(),除了它在进行复制时还会反转每个位。 首先我做了这个:
void InvertCopy( void *v_dst, const void *v_src, int length )
{
char *dst = v_dst;
const char *src = v_src;
for ( ; length>0; length-- )
{
*(dst++) = ~ *(src++);
}
}
它可以工作,但出于性能考虑,我想利用处理器的字长。为此,整数指针会非常好,除了我的 InvertCopy 应该同时处理 int 指针和非 int 指针,因此我不能简单地将指针转换为 int* - 在某些处理器上它实际上可能会导致硬件故障。
为了更容易,我决定在处理未对齐的缓冲区时允许较慢的性能,并且仅在可能的情况下进行此优化。结果是这样的:
#define IS_ALIGNED( addr, size ) ( ((uintptr_t)(addr)) % (size) == 0 )
void InvertCopy( void *v_dst, const void *v_src, int length )
{
char *dst = v_dst;
const char *src = v_src;
/* Optimization starts here! */
if ( IS_ALIGNED( dst, sizeof(int) ) && IS_ALIGNED( src, sizeof(int) ) )
{
int *i_dst = v_dst;
const int *i_src = v_src;
for ( ; length >= sizeof(int); length -= sizeof(int) )
{
*(i_dst++) = ~ *(i_src++);
}
dst = (char*) i_dst;
src = (const char*) i_src;
}
/* Optimization done. */
for ( ; length>0; length-- )
{
*(dst++) = ~ *(src++);
}
}
这很棒,而且在我的实验中实际上运行得更快。
但这是正确的吗? GCC 在使用 -Wcast-align 进行编译时没有给我任何警告,但我认为这并不意味着什么,因为当我在没有先检查对齐情况的情况下执行相同操作时,它也什么也没说。
那么我做得对还是应该担心对齐问题?
【问题讨论】:
-
我觉得没问题。但更好的方法是复制前几个字节,直到两个缓冲区对齐。这样,您将更频繁地使用优化。请参阅此相关问题:stackoverflow.com/questions/1898153/…
标签: c pointers casting alignment warnings