问题标签 [memcpy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
637 浏览

c++ - 带有模板的 C++ 数据包生成器

PacketBuilder 是一个允许写入 char* 数组的小类。附加功能:

编译没有错误。如果我调用 Append 并将 T 用作 unsigned short (WORD)。它工作得很好。如果我使用 T 作为无符号字符。我收到链接器错误。

来自 VS2010 的错误(对不起,我得到了德语 vs2010):

错误 LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall PacketBuilder::Append(unsigned char)" (??$Append@E@PacketBuilder@@QAEXE@Z)" in Funktion ""public: void __thiscall Client: :DoHandshake(void)" (?DoHandshake@Client@@QAEXXZ)"。1>C:\XXX\C++\SilkroadEmu\Debug\LoginServer.exe : 致命错误 LNK1120: 1 nicht aufgelöste externe Verweise。

翻译成英文:

错误 LNK2019:函数“”公共:void __thiscall Client::DoHandshake(无效)“(?DoHandshake@Client@@QAEXXZ)”。1>C:\XXX\C++\SilkroadEmu\Debug\LoginServer.exe : 致命错误 LNK1120: 1 unsresolved external symbol。

0 投票
1 回答
3799 浏览

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

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

使用内置函数需要满足哪些条件?我可以快速推出自己的 memcpy,但我确信内置比我​​能做的更有效。

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

CXXFLAGS:-O3 -DNDEBUG

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

0 投票
3 回答
3662 浏览

c - 如何获取 C 宏中声明的变量的地址?

我是 C 新手,正在尝试一些宏语句。我有这样的一行:

在以后的功能中,我想用它memcpy来复制VALUE另一个内存区域。像这样:

传入的 VALUE 可以是任何类型的数据。这就是为什么我使用 void* 来指向它并使用 memcpy 来复制字节大小的数量。

但它当然不起作用:)

这就是我调用函数的方式:

GCC 给了我这个:

错误:需要左值作为一元“&” 操作数

有谁知道如何找到传递给宏的变量的地址以允许我使用该地址进行复制?

可以更改宏的后半部分(“write_implement”和参数,但不能更改“write_data”参数)。并且实现部分也可以自由更改。

0 投票
4 回答
9542 浏览

c - memcpy() 将整数值复制到字符缓冲区

我正在尝试将 int 的内存值复制到 char 缓冲区中。代码如下所示,

当我打印 str1 时,它是空白的。请澄清。

0 投票
8 回答
41178 浏览

c - 如何提高 memcpy 的性能

概括:

memcpy 似乎无法在我的系统上以超过 2GB/秒的速度在真实或测试应用程序中传输。我可以做些什么来获得更快的内存到内存副本?

完整详情:

作为数据捕获应用程序的一部分(使用一些专门的硬件),我需要将大约 3 GB/秒的数据从临时缓冲区复制到主内存中。为了获取数据,我为硬件驱动程序提供了一系列缓冲区(每个 2MB)。硬件 DMA 将数据发送到每个缓冲区,然后在每个缓冲区已满时通知我的程序。我的程序清空缓冲区(memcpy 到另一个更大的 RAM 块),并将处理后的缓冲区重新发布到卡上以再次填充。我在使用 memcpy 足够快地移动数据时遇到问题。似乎内存到内存的复制速度应该足够快,可以在我正在运行的硬件上支持 3GB/秒。Lavalys EVEREST 为我提供了 9337MB/秒的内存复制基准测试结果,但我无法通过 memcpy 获得接近这些速度的任何地方,即使在一个简单的测试程序中也是如此。

我通过在缓冲区处理代码中添加/删除 memcpy 调用来隔离性能问题。如果没有 memcpy,我可以运行完整的数据速率——大约 3GB/秒。启用 memcpy 后,我的速度被限制在大约 550Mb/秒(使用当前编译器)。

为了在我的系统上对 memcpy 进行基准测试,我编写了一个单独的测试程序,它只在某些数据块上调用 memcpy。(我在下面发布了代码)我已经在我正在使用的编译器/IDE(National Instruments CVI)以及 Visual Studio 2010 中运行了它。虽然我目前没有使用 Visual Studio,但我愿意如果它会产生必要的性能,则进行切换。但是,在盲目移动之前,我想确保它可以解决我的 memcpy 性能问题。

Visual C++ 2010:1900 MB/秒

NI CVI 2009:550 MB/秒

虽然 CVI 明显比 Visual Studio 慢我并不感到惊讶,但 memcpy 性能如此之低让我感到惊讶。虽然我不确定这是否可以直接比较,但这远低于 EVEREST 基准带宽。虽然我不需要那么高的性能,但至少需要 3GB/秒。当然,标准库的实现不会比任何 EVEREST 使用的更糟糕!

在这种情况下,我能做些什么来让 memcpy 更快?


硬件细节:AMD Magny Cours - 4x 八核 128 GB DDR3 Windows Server 2003 Enterprise X64

测试程序:

编辑:如果您有额外的 5 分钟时间并想做出贡献,您可以在您的机器上运行上述代码并将您的时间作为评论发布吗?

0 投票
11 回答
183858 浏览

c - memcpy() 与 memmove()

我试图理解 和 之间的区别memcpy(),并且我已经阅读了不处理重叠源和目标memmove()的文本。memcpy()memmove()

但是,当我在重叠的内存块上执行这两个函数时,它们都会给出相同的结果。例如,以memmove()帮助页面上的以下 MSDN 示例为例:-

有没有更好的例子来理解它的缺点memcpy以及如何memmove解决它?

输出:

0 投票
2 回答
3205 浏览

c++ - 错误编译器,无法将参数 2 从 MyStruct1 转换为 const void*,用于 memcpy

我正在尝试将数据从结构复制到另一个。每个结构可以处理的字节相同。我的声明和 memcpy 如下:

现在假设第一个结构 Data1 有数据,而第二个刚刚声明。

我正在使用以下代码:

出现错误时我无法编译。有任何想法吗?还有其他复制数据的方法吗?

0 投票
3 回答
1556 浏览

c++ - 如何使用 Memcpy() 函数

我想最后使用 memcpy,而不是

使用 memcpy 时出错

src/coder.c:909: 错误:二进制 * 的无效操作数(有 'unsigned int' 和 'int **')
src/coder.c:910: 错误:二进制 * 的无效操作数(有 'unsigned int' 和'int **')

如何正确使用 memcpy?

0 投票
7 回答
6478 浏览

c - Linux 设备驱动程序:找不到符号“memcpy”

我正在尝试编写 Linux 设备驱动程序。在我尝试使用“memcpy”之前,我已经让它工作得很好。我什至没有收到编译器错误,当我“制作”时它只是警告我:

WARNING: "memcpy" [/root/homedir/sv/main.ko] undefined!

好的,当我尝试通过 insmod 加载时,我进入控制台:

insmod: error inserting './main.ko': -1 Unknown symbol in module

在 dmesg 上:

main: Unknown symbol memcpy (err 0)

我包括以下内容:

使用 memcpy 的函数:

有人可以帮助我吗?我以为事情在 linux/string.h 中,但我得到的错误是一样的。我正在使用内核 2.6.37-rc1(我在用户模式 ​​linux 中进行操作,它仅从 2.6.37-rc1 开始工作)。任何帮助是极大的赞赏。

0 投票
6 回答
42783 浏览

c - Difference between strncpy and memcpy?

How can I access s[7] in s?

I didn't observe any difference between strncpy and memcpy. If I want to print the output s, along with s[7] (like qwertyA), what are the changes I have to made in the following code:

Output: