strcpy vs memcpy用于复制已知大小的char *

时间:2014-07-28 07:14:40

标签: c memcpy literals strcpy

我不关心NULL终止符,所以我有两个选择:

strcpy(createTabStmt, "CREATE TABLE "); //shorter and more readable code

或者

memcpy(createTabStmt, "CREATE TABLE ", sizeof ("CREATE TABLE ") - 1); //faster?

memcpy版本总是更快吗?

-

如果这是真的,那么我认为宏可以使可读性与strcpy一样好:

#define MEMCPY_LITERAL(ptr,literal) memcpy(ptr, literal, sizeof (literal) - 1)

-

我认为memcpy版本还有一个sizeof ("CREATE TABLE ") - 1。所以它占用了更多的空间。这是真的吗?

4 个答案:

答案 0 :(得分:4)

假设源是文字,我希望任何体面的优化编译器对任何一个做同样的事情(以memcpy版本减少一个字节的方式为模):调用memcpy具有适当的大小,或生成内联代码以直接将内容存储到目标。您可以使用gcc和兼容的编译器验证这一点,方法是使用-S代替-c输出汇编语言,或者通过反汇编输出程序。

答案 1 :(得分:0)

Strcpy将进行大量优化,我的期望是您将无法衡量这两个语句之间的差异。那个,数据库将在CREATE TABLE上做成千上万的事情,所以你应该在这里优化可读性。只需使用strcpy,人们就知道它是什么,编译器知道它是什么,它可以完美地满足您的需求。

答案 2 :(得分:0)

如果已知大小,通常memcpy的非天真实现比strcpy快,因为它会占用CPU的数据总线大小。例如,如果要复制16个字节,64位CPU中的良好实现将分解两个8字节副本中的数据传输。这是通过将源指针和目标指针转换为64位变量指针,然后通过两次迭代读取/写入内存来实现的。

检查此链接: Understanding the source code of memcpy()

答案 3 :(得分:0)

作为基本规则,您应该使用strcpy作为字符串,使用memcpy作为数据。 一旦你开始更改它以保持可忽略的性能,你就会使代码变得难以理解和混乱。

这也适用于宏 - 您也应该避免使用它们,因为它们可能会导致重写代码的任何人(或者从现在起几个月/几年内)的编译错误。

在大多数情况下,除非您编写性能至关重要的代码(大多数情况下并非如此)