以下是简单的c源代码,其中char x[2048]
是全局var,func1
由thread1
调用,func2
由thread2
调用:
char x[2048]={0} , y[16]={0};
void func1(){
strcpy(x,y);
}
void func2(){
printf("(%s)\n",x);
}
int main(int argc, char **argv){
strncpy(y,argv[1],sizeof(y)-1);
}
在Intel的cpu中,一个缓存行有64个字节,所以x应该占用32个 缓存行,我的问题是:
当thread1
调用func1
时,是否所有32个缓存行都可用于该缓存行,直到那时为strcpy
? (或)编译器知道只有一个缓存行足以完成这项工作吗?
当thread2
调用func2
时,是否所有32个缓存行都可用于该缓存,然后执行printf
? (或)编译器可以识别一个缓存行就足够了吗?
答案 0 :(得分:4)
我建议你阅读维基百科页面:https://en.wikipedia.org/wiki/CPU_cache
一些背景知识:
回答你的问题:
更多信息:
答案 1 :(得分:0)
在x86和x64(以及现代ARM和其他常见的CPU)上,缓存对用户模式程序完全透明。
结果,strcpy
执行第一次读取,CPU自动拉入一个缓存行,strcpy
退出\0
并完成。与printf("%s",x)
相同。