我不关心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
。所以它占用了更多的空间。这是真的吗?
答案 0 :(得分:4)
假设源是文字,我希望任何体面的优化编译器对任何一个做同样的事情(以memcpy
版本减少一个字节的方式为模):调用memcpy
具有适当的大小,或生成内联代码以直接将内容存储到目标。您可以使用gcc和兼容的编译器验证这一点,方法是使用-S
代替-c
输出汇编语言,或者通过反汇编输出程序。
答案 1 :(得分:0)
Strcpy将进行大量优化,我的期望是您将无法衡量这两个语句之间的差异。那个,数据库将在CREATE TABLE
上做成千上万的事情,所以你应该在这里优化可读性。只需使用strcpy,人们就知道它是什么,编译器知道它是什么,它可以完美地满足您的需求。
答案 2 :(得分:0)
如果已知大小,通常memcpy
的非天真实现比strcpy快,因为它会占用CPU的数据总线大小。例如,如果要复制16个字节,64位CPU中的良好实现将分解两个8字节副本中的数据传输。这是通过将源指针和目标指针转换为64位变量指针,然后通过两次迭代读取/写入内存来实现的。
答案 3 :(得分:0)
作为基本规则,您应该使用strcpy作为字符串,使用memcpy作为数据。 一旦你开始更改它以保持可忽略的性能,你就会使代码变得难以理解和混乱。
这也适用于宏 - 您也应该避免使用它们,因为它们可能会导致重写代码的任何人(或者从现在起几个月/几年内)的编译错误。
在大多数情况下,除非您编写性能至关重要的代码(大多数情况下并非如此)