这种复制字符串的方法是否比单独复制每个字符更快?
Is this method of copying a string faster than copying each char individually?
这种复制字符串的方法比单独复制每个字符更快吗?这段代码的想法是它可以(但我不确定是否如此)一次复制 8 个字节而不是单个字节更快。这是非常不安全的,但它似乎以某种方式工作。或者这只是个坏主意?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* copy_string(char s[])
{
int len=strlen(s);
int i=0;
double *p=(double*)s;
double *copy=(double*)malloc(len+1);
while(i-len>8)
{
*copy=*(p++);
copy++;
i+=8;
}
char *p2=(char*)p;
char *c=(char*)copy;
while(i<len)
{
*c=*(p2++);
c++;
i++;
}
*c='[=10=]';
return copy;
}
int main()
{
char s[]="GOODBYE SAFE WORLD!";
char *c=copy_string(s);
printf("%s",c);
return 0;
}
像这样的技巧可能在某些情况下在某些体系结构上更快。如果适用,请相信您的 C 库提供商了解这些技巧。
在您的情况下,您的代码完全是错误的。假设第一个while循环的条件是固定的,违反了指针转换的规则:
A pointer to an object type may be converted to a pointer to a
different object type. If the resulting pointer is not correctly
aligned for the referenced type, the behavior is undefined.
在许多体系结构上,这只会导致 "bus error"。
要了解这些技巧是如何工作的,请查看您最喜欢的 C 库的源代码并查找它们对 memcpy
和 memmove
的实现。
这种复制字符串的方法比单独复制每个字符更快吗?这段代码的想法是它可以(但我不确定是否如此)一次复制 8 个字节而不是单个字节更快。这是非常不安全的,但它似乎以某种方式工作。或者这只是个坏主意?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* copy_string(char s[])
{
int len=strlen(s);
int i=0;
double *p=(double*)s;
double *copy=(double*)malloc(len+1);
while(i-len>8)
{
*copy=*(p++);
copy++;
i+=8;
}
char *p2=(char*)p;
char *c=(char*)copy;
while(i<len)
{
*c=*(p2++);
c++;
i++;
}
*c='[=10=]';
return copy;
}
int main()
{
char s[]="GOODBYE SAFE WORLD!";
char *c=copy_string(s);
printf("%s",c);
return 0;
}
像这样的技巧可能在某些情况下在某些体系结构上更快。如果适用,请相信您的 C 库提供商了解这些技巧。
在您的情况下,您的代码完全是错误的。假设第一个while循环的条件是固定的,违反了指针转换的规则:
A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned for the referenced type, the behavior is undefined.
在许多体系结构上,这只会导致 "bus error"。
要了解这些技巧是如何工作的,请查看您最喜欢的 C 库的源代码并查找它们对 memcpy
和 memmove
的实现。