首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我可以保证C++编译器不会重新排序我的计算吗?

关于C++编译器是否会重新排序计算的问题,这涉及到C++的内存模型和编译器优化。C++的内存模型定义了多线程程序中如何访问和处理内存,以及不同线程之间的操作顺序。在C++11之前,C++的内存模型并未明确规定编译器不能重新排序计算,因此编译器可能会对代码进行优化,导致计算顺序发生变化。

然而,在C++11中,C++的内存模型被重新定义,引入了序列一致性(sequentially consistent)的概念,这意味着编译器和处理器必须确保所有线程都能看到一致的操作顺序。因此,在C++11及以后的版本中,编译器通常不会重新排序计算,除非你明确指定了不同的内存顺序。

如果你希望确保编译器不重新排序计算,可以使用C++11中的std::atomic类型和内存序列(memory order)来控制操作的顺序。例如,你可以使用std::memory_order_seq_cst内存序列来确保操作的顺序一致性。

总之,在C++11及以后的版本中,编译器通常不会重新排序计算,除非你明确指定了不同的内存顺序。如果你需要确保计算顺序,可以使用C++11中的std::atomic类型和内存序列来控制操作的顺序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【译】编程语言内存模型 Programming Language Memory Models

通常,现代语言保证无数据竞争程序总是以顺序一致方式执行,就像来自不同线程操作都被安排到单一处理器上交叉执行,但没进行重新排序一样。...通常,我们认为只要对读写操作排序不会影响其在单线程中执行,那么编译器可以任意地对这些操作进行重排序。...但是线程 2 并不一定能打印出 1,没有禁止编译器对 x 和 done 访问进行重新排序,也没有要求禁止硬件做同样事情。...相反,个人结论是,在多线程程序中,编译器不应该假设他们可以通过重新执行初始化它内存读取来重新加载像 i 这样局部变量。...事实证明,对于等价 ARMv8 指令序列,对 x 非原子写入可以在对 y 原子写入之前重新排序,因此该程序实际上确实产生了 r1=0,r2=1 结果。

1.5K20

编程语言内存模型

在最初始程序中,在编译器代码重新排序之后,线程1可能会在线程2读取x同时写x。这是data race问题。...人们普遍认为,编译器几乎可以任意地对普通内存读写进行重新排序,前提是重新排序不能改变观察到单线程代码执行效果。...拥有更少分支并彻底消除if体可能更快。如果我们编写代码有问题,我们可以在if之前运行了x++,然后在else中用x--进行调整。也就是说,编译器可能会考虑将该代码重写为: 这是安全编译器优化?...前面我们讨论了重新排序读操作会如何破坏一致性,但是你可能会想,好吧,不要重新排序读操作。这里有一个更微妙方法,可以通过另一个优化来打破一致性:公共子表达式消除。...个人结论是,在多线程程序中,编译器不应该认为它们可以通过重新执行初始化局部变量内存读取来重新加载像i这样局部变量。

69230

深入理解无锁编程「建议收藏」

内存排序 正如流程图所暗示那样,任何时候您对多核(或任何对称多处理器)进行无锁编程,并且您环境不保证顺序一致性,您必须考虑如何防止内存重新排序。...在当今体系结构中,强制执行正确内存排序工具通常分为三类,它们可以防止编译器重新排序和处理器重新排序: 轻量级同步或栅栏指令; 一个完整内存栅栏指令; 提供获取或释放语义内存操作。...因此,过去常常编写能在x86/64 上运行成功但在其他处理器上失败无锁代码。 如果你对处理器需要内存排序硬件细节感兴趣,推荐附录并行编程困难?...请记住在任何情况下,由于编译器指令重排序也会导致内存重新排序。 在这篇文章中,没有过多地谈论无锁编程实际方面,例如:我们什么时候做?我们真正需要多少?也没有提到验证无锁算法重要性。...尽管如此,希望对于一些读者来说,这篇介绍已经提供了对无锁概念基本熟悉,因此您可以继续深入阅读其他文章而不会感到太困惑。

79421

腾讯、阿里、滴滴后台面试题汇总总结 — (含答案)

Q8. c++ vector和list区别? A:vector是动态数组,会动态进行分配内存,进行扩容操作。list是双向链表。 Q9. 访问vector迭代器时候可以删减元素?...快速排序时间复杂度 A:快速排序平均时间复杂度位nlogn,最差O(n^2) Q15. nLogn是排序最好时间复杂度? A:不是,还有O(n)算法,比如说基数排序。 Q16....基数排序原理以及应用 A:基数排序根据一个数高低位进行排序。应用不知道,缺点是对负数处理不太好。 Q17. 介绍负载均衡应用 A:不知道。 Q18. http协议有用过? A:这个没用过。...关于优化以及编译问题,事后查了相关资料,这里推荐两本书:《深入理解计算机系统》、《程序员自我修养—链接、装载与库》。对于优化原理、编译器原理讲解非常好。...这样回答,往往给人感觉就是很水,搞技术不会可以,但是不会可以学啊,虽然,整体架构没涉及过,但是,没吃过猪肉不能没见过猪跑。做了那么久,产品啥架构还不了解,这就有点说不过去了。

7.6K11

C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案

如果使用了这个修饰词,就是通知编译器别犯懒,老老实实去重新读一遍!可能太“通俗”了,那么引用一下“大师”标准解释: volatile本意是“易变” 。...如果使用了这个修饰词,就是通知编译器别犯懒,老老实实去重新读一遍!可能太“通俗”了,那么引用一下“大师”标准解释: volatile本意是“易变” 。...15、C也可以通过精心封装某些函数功能实现重用,那C++类有什么优点,难道仅仅是为实现重用。 正确答案: 并不仅仅是这样。...2)有些编译器可以对const常量进行调试, 不能对宏调试。 19、 C++函数中值传递方式有哪几种? 正确答案: C++函数三种传递方式为:值传递、指针传递和引用传递。...不可否认,gcc是linux下一个亮点,是一个备受无数程序员推崇编译器,其优点省略1000字,有兴趣可以自己查,翻了翻书,书上曰:支持C,C++,Java,Obj-C,Ada,Fortran,Pascal

1.6K20

Java 与 CC++ 编译器对比

但目前即时编译技术已经十分成熟,Java语言有可能在速度上与C/C++一争高下?要想知道这个问题答案,让我们从两者编译器谈起。...第四,Java语言是可以动态扩展语言,运行时加载新类可能改变程序类型继承关系,这使得很多全局优化难以进行,因为编译器无法看清程序全貌,许多全局优化都只能以激进优化方式来完成,编译器不得不时刻注意并随着类型变化而在运行时撤销或重新进行一些优化...Java类型安全保证了在类似如下代码中,只要ClassA和ClassB没有继承关系,那对象objA和objB就绝不可能是同一个对象,即不会是同一块内存两个不同别名。...123 print(objA.x); } 确定了objA和objB并非对方别名后,许多与数据依赖相关优化才可以进行(重排序、变量替换)。...总结 随着Java JIT编译技术发展,Java运行速度已经足够快。Java能够在运行时动态加载类(可以从zip包、网络、运行时计算、其他文件生成),C/C++则完全做不到这一点。

1.3K60

没想到你竟然是这样volatile!

排序 在阐述volatile有序性之前,需要先补充一些关于重排序知识。 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序一种手段。 为什么要有重排序呢?...为了实现volatile内存语义,JMM会限制特定类型编译器和处理器重排序,JMM会针对编译器制定volatile重排序规则表: ?...读,也不会发生重排序 如何保证这些操作不会发送重排序呢?...总结 全文重点是围绕volatile可见性和有序性展开,其中花了不少部分篇幅描述了一些计算机底层概念,对于读者来说可能过于无趣,但如果你能认真看完,相信你或多或少也会有一点收获。...没有看过C语言,C++里面volatile关键字是如何实现,但我相信底层原理一定是相通。 它提供一种轻量级同步机制,能够保证可见性和有序性,但是不能保证原子性。

30430

【JAVA】Java 内存模型中 happen-before

早期类似 C、C++ 等语言,并不存在内存模型概念(C++ 11 中也引入了标准内存模型),其行为依赖于处理器本身内存一致性模型,但不同处理器可能差异很大,所以一段 C++ 程序在处理器 A 上运行正常...即使如此,最初 Java 语言规范仍然是存在着缺陷,当时目标是,希望 Java 程序可以充分利用现代硬件计算能力,同时保持“书写一次,到处执行”能力。...这里说指令重排序,既可以编译器优化行为,也可能是源自于现代处理器乱序执行等。...从理论上来说,多线程共享引入了复杂数据依赖性,不管编译器、处理器怎么做重排序,都必须尊重数据依赖性要求,否则就打破了正确性!这就是 JMM 所要解决问题。...initialized) sleep(); // use configOptions JSR-133 重新定义 JMM 模型,能够保证线程 B 获取 configOptions 是更新后数值。

12130

腾讯2016春季校园实习招聘技术岗初试(一面)问题汇总(CC++后台)

如函数void foo(int,int)被C编译器编译后在符号库中名字为_foo,而C++编译器则会产生像_foo_int_int之类名字(不同编译器可能生成名字不同,但是都采用了相同机制,生成新名字称为...问题七: 说一下CC++程序内存布局。 答: 目前还没有找到很权威著作对此问题有详细论述,肯定有,只是还不知道。看了《C++高级进阶教程》中描述如下。...当close-on-exec状态为0时,调用exec时,fd不会被关闭;状态非零时则会被关闭,这样做可以防止fd泄露给执行exec后进程。...我们没有必要为每一位登陆验证用户创建服务线程,可以采用线程池方式来进行优化。 问题十六: 你了解过数据挖掘。对这方面感兴趣? 答: 没了解过但很感兴趣。...不会问题尽量去思考,面试官希望看到面试者思考过程,不懂也向他请教,寻求提示,这也间接产生了互动。 整个面试过程所遇到问题,除了最后一个是比较开发题目,前面都是比较基础题目。

43811

深入汇编指令理解Java关键字volatile

排序 在阐述volatile有序性之前,需要先补充一些关于重排序知识。 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序一种手段。 为什么要有重排序呢?...为了实现volatile内存语义,JMM会限制特定类型编译器和处理器重排序,JMM会针对编译器制定volatile重排序规则表: 总结来说就是: 第二个操作是volatile写,不管第一个操作是什么都不会排序...第一个操作是volatile读,不管第二个操作是什么都不会排序 第一个操作是volatile写,第二个操作是volatile读,也不会发生重排序 如何保证这些操作不会发送重排序呢?...总结 全文重点是围绕volatile可见性和有序性展开,其中花了不少部分篇幅描述了一些计算机底层概念,对于读者来说可能过于无趣,但如果你能认真看完,相信你或多或少也会有一点收获。...没有看过C语言,C++里面volatile关键字是如何实现,但我相信底层原理一定是相通

32310

浅墨: 聊聊原子变量、锁、内存屏障那点事(2)

Barrier):避免编译器排序优化操作,保证编译程序时在优化屏障之前指令不会在优化屏障之后执行。...内存信息已经修改,屏障后寄存器值必须从内存中重新获取 2.必须按照代码顺序产生汇编代码,不得越过屏障 C/C++volatile关键字也能起到优化限制作用,但是和Java中volatile(Java...5之后)不同,C/C++volatile不提供任何防止乱序功能,也并不保证访存原子性。...简单翻译一下: 读操作之间不能重新排序 写操作不能跟旧读操作排序 主存写操作不能跟其他写操作排序,但是以下情况除外: 带有CLFLUSH(失效缓存)指令写操作 带有non-temporal move...最后,讨论这些问题文章太多了,各路说法到处飞,也不敢保证这篇文章说法全部正确,但至少觉得是可以自圆其说。如果你觉得哪里描述有问题,不妨一起讨论,我们一起纠正这些错误观点。

1.4K40

中科大软件学院硕士:实习秋招百多轮面试总结(上)

为什么指针越界在编译时候不会报错,在运行时候会报段错误? 4. 操作系统怎么判断? 5. C++特点,面向对象优点,举例说明? 6....C++多态如何实现?虚函数作用?析构函数可以是虚函数嘛?虚析构函数作用(可以避免内存泄漏),举个例子? 3. 虚函数表存在哪里?一个类一个还是一个对象一个? 4. 编译器会构造几个构造函数?...如何保证os实时性?说一下race condition; 2. 了解无锁编程嘛?了解物联网平台? 3. 说一个你比较熟悉内核模块(进程调度); 4....和你做项目有何关系? 2. 为什么实时系统要选择C语言? 3. 区块链在无人驾驶系统中可以有应用? 4. 操作系统熟嘛?说一个了解比较多说了内核同步); 5....反问环节:华为实习生培养机制?支持长期实习? 结果: 通过 11. 携程云计算 一面: 1. 介绍一下PCA算法,区块链核心是什么? 2.

67530

听说你 “精通” C++???

看你简历上,写是……唔……精通 C++?” :是的 心想,这 HR 还不好糊弄? 面试官:“哦,桌子上有笔和纸,先写一个模板元编程实现编译期堆排序吧。嗯……五分钟够了吧?...但是这段程序在这台电脑上 Clang 3.7 编译会 ICE。你能帮忙修一下 Clang bug ?十分钟可以?”...:“这个……不太熟 Clang……” 面试官:“那你对哪个 C++ 编译器熟悉呢?” :“MSVC!” 想都没想就脱口而出,但是听到下面的话想咬舌自尽。。。。。 ?...哦对了,MSVC 不开源,简单逆向一下就好啦……” :“这个……不太会。” 面试官:“这个也不会?” HR 显得很失望,感觉脸都变了。。。。。开始瑟瑟发抖 ?...一定要保证写上去都是自己会

85220

C++ STL编程轻松入门基础

很难保证不会在处理这个问题时候出错,很多程序bug往往就是这样 产生。同时,你还应该感谢stdlib.h,它为你提供了qsort函数,否则,你还需要自己实现排序算法。...它真的能很好运行吗?你可 以试试,因为程序运行结果和前面的大致差不多,所以在此略去。可以向你保证,这个程序是足够健壮。不过,可能你还没有完全看明白程序代码,所以我 需要为你解释一下。...不必在意那个.h,并不是 疏忽,程序保证可以编译通过,只要你C++编译器支持标准C++规范相关部分。你只需要把它们看作是一些普通C++头文件就可以了。...图5:在C++ Builder IDE环境下运行STL程序 现在你可以在你机器上运行前面的示例程序了。不过,请恕多嘴,有些细节不得不提请你注意。小心编译器给你留下陷阱。...不过有趣是,对于上述那行展开前代码, 在Visual C++里即使你没有加空格,编译器不会报错。而同样代码在C++ Builder中没有那么幸运了。

1.5K91

详细剖析 extern C

可以信任是:所有的现代C++编译器都预先定义了它;而所有C语言编译器不会。...如果能够保证一个C语言头文件直接或间接依赖所有头文件也都是C语言,那么按照C++语言规范,这种嵌套应该不会有什么问题。...或许你会说,“可以去查看这些被包含头文件,可以保证它们不会带来麻烦”。但,何必呢?毕竟,我们完全可以不必为不必要事情买单,不是?...按照C++规范定义,__cplusplus 值应该被定义为199711L,这是一个非零值;尽管某些编译器并没有按照规范来实现,但仍然能够保证__cplusplus值为非零——至少到目前为止还没有看到哪款编译器将其实现为...#endif完全是冗余。 但,C++编译器厂商是如此之多,没有人可以保证某款编译器,或某款编译器早期版本没有将__cplusplus值定义为0。

1.2K30

C++后台研发工程师2018年BAT华为网易等面经总结

JAVA会不会你别问)  数据库用过哪些(没用过你别问),数据库索引介绍一下(。。。) ...单链表翻转,如果只用指针的话怎么翻转  找100亿个数中最小1000个数  二面:  扣简历项目细节  JAVA会(真的不会)  那问点C++吧:多态如何实现、auto如何实现、编译器对extern...看你用是苹果手机,你用过它延时摄影(现在叫慢动作)功能,它为什么在几年前就可以处理4k 60fps画面产生巨大数据流(没用过谢谢)  3.百度-AI芯片算法  一面:  扣简历项目细节 ...(不会,别问)  epoll介绍一下  离线用户行为日志分析系统可以怎么做,随便说一下  如果线上运行服务端崩溃了,如何排查原因并解决 (是查log)  最关键log可能在服务端时崩溃时丢失...写个最长公共子序列题  以上几家公司问过问题基本上是这些,大家如果有什么问题觉得没说清楚可以留言或者私信我,如果后面还面了其他公司还会回来补充

1K30

面试官想到,一个Volatile,敖丙都能吹半小时

因此,在执行程序时,为了提高性能,编译器和处理器常常会对指令进行重排序。 一般重排序可以分为如下三种: 编译器优化排序。...编译器在不改变单线程程序语义前提下,可以重新安排语句执行顺序; 指令级并行排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。...as-if-serial 不管怎么重排序,单线程下执行结果不能被改变。 编译器、runtime和处理器都必须遵守as-if-serial语义。 那Volatile是怎么保证不会被执行重排序呢?...如果现在变了flag变成了false,那么后面的那个操作,一定要知道变了。 聊了这么多,我们要知道Volatile是没办法保证原子性,一定要保证原子性,可以使用其他方法。...注:以上所有的内容如果能全部掌握想Volatile在面试官那是很加分了,但是还没讲到很多关于计算机内存那一块底层,那大家就需要后面去补课了,如果等得及,也可以等到我写计算机基础章节。

82520

用Numba加速Python代码

Benchmark game有一些比较不同编程语言在不同任务上速度可靠基准。 解决这个速度问题一个常见方法是用C++之类快速语言重新编写代码,然后在上面抛出一个Python包装器。...这将使您获得C++速度,同时保持在主应用程序中轻松使用Python。 当然,这样做挑战是,您必须用C++重新编写代码;这是一个非常耗时过程。...Python库Numba为我们提供了一种简单方法来解决这一挑战——无需编写任何代码,只需编写Python! 关于Numba Numba是一个编译器库,它将Python代码转换为优化机器码。...100000个数字是需要排序相当多数字,特别是当我们排序算法平均复杂度为O(n²)时。在i7–8700K电脑上,对所有这些数字进行排序平均需要3.0104秒! ?...上面的代码在PC上组合数组平均运行时间为0.001196秒——大约是2倍加速。添加一行代码也不错! 它总是这么快

2.1K43

如何从C++转Python:改变你思维方式

计算机视觉专家和编程语言爱好者 asya f 刚开始上手 Python 时也这么想。但门槛低就仅意味着使用简单?经常调用 API 的人是不是一定比可以从零写出源码的人菜?...C++和 Python 区别此处不做赘述,网上可以找到很多相关信息。此处只讲述个人经历。 ?...总的来看,你游过水面不会很大。而 Python 有点像潜水——把头伸进水里就能看到它美,但你不会太深入,而是在浅水里游啊游,可以轻易地游过很大一片地方。两种语言如此不同,所以适用场景也不同。...因此,你需要更加了解计算机、编译器和语言。如果深入下去,你会被其中蕴含美所打动,如编译过程和内存管理。 作为一名 C++程序员,更关心句法调整和奇怪例子。一直知道是怎么分配、释放内存。...避免写出 C++风格代码。并且无论如何,不要再依赖类型。 养成新习惯:开始使用库。写 Python 式代码(但不要为了写而写),保证代码可读性。

1K30

计算机视觉专家:如何从C++转Python

计算机视觉专家和编程语言爱好者 asya f 刚开始上手 Python 时也这么想。但门槛低就仅意味着使用简单?经常调用 API 的人是不是一定比可以从零写出源码的人菜?...C++和 Python 区别此处不做赘述,网上可以找到很多相关信息。此处只讲述个人经历。...总的来看,你游过水面不会很大。而 Python 有点像潜水——把头伸进水里就能看到它美,但你不会太深入,而是在浅水里游啊游,可以轻易地游过很大一片地方。两种语言如此不同,所以适用场景也不同。...因此,你需要更加了解计算机、编译器和语言。如果深入下去,你会被其中蕴含美所打动,如编译过程和内存管理。 作为一名 C++程序员,更关心句法调整和奇怪例子。一直知道是怎么分配、释放内存。...避免写出 C++风格代码。并且无论如何,不要再依赖类型。 养成新习惯:开始使用库。写 Python 式代码(但不要为了写而写),保证代码可读性。

66510
领券