Below you will find pages that utilize the taxonomy term “内存重排”
December 17, 2020
Golang中的内存重排(Memory Reordering)
"\u003ch2 id=\"什么是内存重排\"\u003e什么是内存重排\u003c/h2\u003e\n\u003cp\u003e内存重排指的是内存的读/写指令重排。\u003c/p\u003e\n\u003ch2 id=\"为什么要内存重排\"\u003e为什么要内存重排\u003c/h2\u003e\n\u003cp\u003e为了提升程序执行效率,减少一些IO操作,一些硬件或者编译器会对程序进行一些指令优化,优化后的结果可能会导致程序编码时的顺序与代码编译后的先后顺序不一致。\u003c/p\u003e\n\u003cp\u003e就拿做饭场景来说吧,是先蒸米还是先炒菜,这两者是没有冲突的,编译器在编译时有可能与你要求的顺序不一样。\u003c/p\u003e\n\u003ch2 id=\"编译器重排\"\u003e编译器重排\u003c/h2\u003e\n\u003cp\u003e如下面这段代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eX = 0\nfor i in range(100):\n X = 1\n print X\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e要实现打印100次1,很显示在for里面每次都执行X=1语句有些浪费资源,如果将初始变量值修改为1,是不是要快的多。编译器也分析到了这一点,于是在编译时对代码做了以下优化\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eX = 1\nfor i in range(100):\n print X\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e最终输出结果是一样的,两段代码功能也一样。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e但是\u003c/strong\u003e如果此时有另一个线程里执行了一个 X=0 的赋值语句的话(两个线程同时运行),那么输出结果就可能与我们想要的不一样了。\u003c/p\u003e\n\u003cp\u003e优化前情况:第一个线程执行到了第3次print X 后,第二个线程执行了X=0,把X 的值进行了修改,结果就有可能是1110 …\u003c/p\u003e"