gpt4 book ai didi

c++ - 为 gcc 中的小数据或固定大小数据优化的 memcpy

转载 作者:太空狗 更新时间:2023-10-29 22:52:29 25 4
gpt4 key购买 nike

我使用 memcpy 复制可变大小的数据和固定大小的数据。在某些情况下,我会复制少量内存(只有少数字节)。在 GCC 中,我记得 memcpy 曾经是一个内在/内置的。然而(使用 valgrind)分析我的代码时,我看到了对 glibc 中实际“memcpy”函数的数千次调用。

使用内置函数需要满足什么条件?我可以快速滚动我自己的 memcpy,但我确信内置函数比我能做的更有效。

注意:在大多数情况下,要复制的数据量可用作编译时常量。

CXXFLAGS: -O3 -DNDEBUG

我现在使用的代码,强制内置函数,如果你去掉 _builtin 前缀,内置函数就不会被使用。这是使用 T=sizeof(type) 从各种其他模板/函数调用的。使用的大小是 1、2、4 的倍数、一些 50-100 字节大小和一些更大的结构。

template<int T>
inline void load_binary_fixm(void *address)
{
if( (at + T) > len )
stream_error();

__builtin_memcpy( address, data + at, T );
at += T;
}

最佳答案

对于 T 较小的情况,我会专门化并使用原生赋值。

例如,T 为 1 时,只需分配一个字符即可。

如果您知道地址是对齐的,请为您的平台使用适当大小的 int 类型。

如果地址未对齐,您最好进行适当数量的字符分配。

这样做的目的是避免分支并保留计数器。

如果 T 很大,如果您比库 memcpy() 做得更好,我会感到惊讶,并且函数调用开销可能会在噪音中丢失。如果您确实想要优化,请查看周围的 memcpy() 实现。有使用扩展指令等的变体。

更新:

看看您关于内联 memcpy 的实际(!)问题,编译器版本和平台等问题变得相关。出于好奇,您是否尝试过使用 std::copy,像这样:

template<int T>
inline void load_binary_fixm(void *address)
{
if( (at + T) > len )
stream_error();

std::copy(at, at + T, static_cast<char*>(address));
at += T;
}

关于c++ - 为 gcc 中的小数据或固定大小数据优化的 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com