我如何才能获得s[7]的s?
我没有发现strncpy和之间的任何区别memcpy.如果我想打印输出s,以及s[7](像qwertyA),我必须在以下代码中进行哪些更改:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s[10] = "qwerty", str[10], str1[10];
s[7] = 'A';
printf("%s\n",s);
strncpy(str,s,8);
printf("%s\n",str);
memcpy(str1,s,8);
printf("%s\n",str1);
return 0;
}
/*
O/P
qwerty
qwerty
qwerty
*/
Run Code Online (Sandbox Code Playgroud) 为了在PowerPC上寻找一个好的内存策略,我写了几个复制函数.使用具有高速缓存提示(dcb*)的Altivec或fp寄存器可以使大数据的简单字节复制循环的性能提高一倍.最初很满意的是,我定期记忆,看看它的比较...比我最好的速度快10倍!我无意重写memcpy,但我希望从中学习并加速几个简单的图像过滤器,这些过滤器花费大部分时间将像素移入和移出内存.
Shark分析显示它们的内部循环使用dcbt预取,有4个向量读取,然后是4个向量写入.在调整了我的最佳函数以便每次迭代运行64个字节之后,memcpy的性能优势仍然令人尴尬.我正在使用dcbz来释放带宽,Apple没有使用任何东西,但两个代码都倾向于对商店犹豫不决.
prefetch dcbt future dcbt distant future load stuff lvx image lvx image + 16 lvx image + 32 lvx image + 48 image += 64 prepare to store dcbz filtered dcbz filtered + 32 store stuff stvxl filtered stvxl filtered + 16 stvxl filtered + 32 stvxl filtered + 48 filtered += 64 repeat
有没有人对为什么非常相似的代码有如此戏剧性的性能差距有一些想法?我喜欢用真正的图像过滤器来腌制真正的图像过滤器!
附加信息:所有数据都是矢量对齐的.我正在制作图像的过滤副本,而不是替换原始图像.该代码在PowerPC G4,G5和Cell PPU上运行.Cell SPU版本已经非常快.
是memcpy()通常速度比strcpy()(上最真实的平台)?(我假设字符串的大小是已知的.)
如果我正确地记得i386汇编程序,则会有loop指令复制给定数量的字节或单词.所以它是最快的方式,而strcpy()i386汇编程序实现将'\0'在一个简单的循环中使用手动检查.
所以我觉得在x86上memcpy()要快于strcpy().
其他架构是什么?
memcpy()和源之间的关键区别memmove()是,memmove()当源和目标重叠时,它将正常工作.当缓冲区肯定不重叠时,memcpy()更可取,因为它可能更快.
困扰我的是这个潜在的.它是一种微观优化还是存在真正重要的例子,当memcpy()我们真的需要使用memcpy()而不是坚持memmove()到处时?
我有一个存储JSON的数据库,以及一个提供外部API的服务器,通过HTTP帖子,可以更改此数据库中的值.数据库由内部的不同进程使用,因此具有共同的命名方案.
客户看到的密钥是不同的,但是使用数据库中的密钥(有未公开的密钥)将1:1映射.例如:
这是在数据库中:
{ "bit_size": 8, "secret_key": false }
Run Code Online (Sandbox Code Playgroud)
这是呈现给客户:
{ "num_bits": 8 }
Run Code Online (Sandbox Code Playgroud)
API可以根据字段名称进行更改,但数据库始终具有一致的键.
我在结构中将字段命名为相同,并为json编码器指定了不同的标志:
type DB struct {
NumBits int `json:"bit_size"`
Secret bool `json:"secret_key"`
}
type User struct {
NumBits int `json:"num_bits"`
}
Run Code Online (Sandbox Code Playgroud)
我正在使用encoding/jsonMarshal/Unmarshal.
这reflect是正确的工具吗?是否有更简单的方法,因为所有键都相同?我在想某种memcpy(如果我保持用户字段的顺序相同).
memcpyGCC中有一个C99/posix 函数版本:__builtin_memcpy.
有时它可以被GCC替换为内联版本的memcpy,在其他情况下,它被替换为调用libc的memcpy.例如,这里注意到:
最后,在编译器注释中,__ builtin_memcpy可以回退到发出memcpy函数调用.
这个选择的逻辑是什么?在其他gcc兼容的编译器中逻辑是否相同,如clang/llvm,intel c ++编译器,PCC,suncc(oracle studio)?
当我更喜欢使用__builtin_memcpy而不是简单的memcpy?
考虑以下代码:
void MemMove8(void* dst, void* src)
{
char tmp[8];
memcpy(tmp, src, 8);
memcpy(dst, tmp, 8);
}
Run Code Online (Sandbox Code Playgroud)
MSVC (16.7.1) x86 with /O2 为此函数生成以下程序集:
; _dst$ = ecx
; _src$ = edx
mov eax, DWORD PTR [edx]
mov DWORD PTR [ecx], eax
mov eax, DWORD PTR [edx+4]
mov DWORD PTR [ecx+4], eax
Run Code Online (Sandbox Code Playgroud)
但如果输入和输出缓冲区重叠,这将不起作用(在某些情况下)。
生成的代码对我来说似乎是错误的;或者这是一个有效的转换,我在这里遗漏了什么?
memcpy ×10
c ×5
c++ ×3
optimization ×2
x86 ×2
altivec ×1
built-in ×1
c99 ×1
compiler-bug ×1
gcc ×1
go ×1
json ×1
memmove ×1
memory ×1
memset ×1
performance ×1
powerpc ×1
reflection ×1
security ×1
shark ×1
strcpy ×1
strncpy ×1
visual-c++ ×1