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

C++我可以期望所有编译器都不会破坏被返回的副本吗?

在C++中,被返回的副本可能会被编译器优化,但这并不意味着所有编译器都会破坏它。编译器优化是一个复杂的过程,它可能会根据具体的编译器版本、优化选项和目标平台进行不同程度的优化。因此,不能保证所有编译器都不会破坏被返回的副本。

为了确保代码的可移植性和正确性,建议使用标准的C++编程实践,例如使用const引用参数来避免不必要的副本,以及使用合适的构造函数和析构函数来管理资源。此外,也可以使用编译器的优化选项来控制优化程度,以确保代码的正确性和性能。

总之,不能保证所有编译器都不会破坏被返回的副本,但可以通过遵循标准的C++编程实践和使用合适的编译器选项来确保代码的正确性和性能。

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

相关·内容

C++ 实用指南

你需要学习所有这些东西才能写出好代码?如何在当今 C++ 世界中保持理智? 介   绍 你可能知道 C++ 是一种复杂语言。甚至发现了一整页 Wiki 是讲对 Cpp 批判。...你可以抱怨增加这些复杂性,想学好所有这些东西也很困难。但这有那么可怕?面对这样情况,你能做些什么? 首先,我们来看看你在 C++ 中可能会遇到一些问题。...不会写很多通用代码,所以幸运是,不必一直考虑移动语义。但是,当我遇到 move 和 const 时会很困惑——请参阅上一篇关于该主题 文章。不相信所有 C++ 开发人员都会理解这里规则。...例如,你现在可以安全地返回std::vector并确保它可能移动甚至被删除,而无需额外副本。 至于模板,它变得越来越容易使用。概念让代码更安全,没有像 SFINAE 这样技巧。...首先,建议去 isocpp.org 查看所有事件 / 新闻 / 文章。然后你可以查看 Meeting C++ 和有关本地 C++ 小组信息。

52220

C 与 C++ 40 年爱恨情仇

当时,Bjarne Stroustrup明白编程语言有许多组成部分,除了语言本身,还有编译器、链接器和各种库。提供熟悉工具有助于语言广泛接受。...extern “C” 标记并没有得到广泛一致使用,而且它只能影响修饰,而不会影响语法或语义。头文件仅对预处理器有影响,对于C++编译器而言,所有内容都是C++转换单元,因此也就是C++。...然而,人们依然会在C++中包含C头文件,并期望它“正常工作”,而大多数时候也确实可以正常工作。 那么,我们不禁想问: 由不同地方、不同的人开发C++代码如何保持C兼容性? 恐怕很难。...C语言环境也与C++完全不同。C多用于平台,更多地用于编译器。每个人(甚至他们狗狗)都会编写C编译器,因为该语言特性集很小,所以任何人都可以编写C编译器。...这又是一个理念不同。 因此,你提议破坏了C兼容性 提议P2178一部分理论上会影响与C兼容性。这样的话所有方案都不会令人满意。 有人可能会说,你可以先向C委员会提议你新特性。

27220
  • 为什么泛型会让你Go程序变慢

    理解为为每个必须操作类型单独,创建一个函数副本。比如,你想实现两数相加函数,当调用 float64 类型时,编译器会创建一个函数副本,并将通用类型占位符替换为 float64....为了让回调在迭代器中被内联,我们必须用我们特定回调实例化一个 ForEachRune 副本。但是Go编译器不会这么做。任何明智编译器都不会为一个函数生成一个以上实例。除非......如果我们函数回调不是对 generic shape 回调,而是 func(rune) 回调一个单态实例,这将允许 Go 编译器将整个调用扁平化。你明白在说什么?...总的来说,这可能让那些期望将泛型作为优化 Go 代码强大选项的人有点失望,就像在其他系统语言中那样。我们已经了解到(希望!)很多关于Go编译器处理泛型有趣细节。...觉得这个复杂技术选择背后有一个强有力指导因素,那就是我们都持有的潜在误导性假设,比如说 "单态化C++代码很慢"。这又提出了一个问题:是这样

    30830

    volatile 关键字详解

    保持内存可见性 内存可见性(Memory Visibility):所有线程都能看到共享内存最新状态。...read:作用主内存,把一个变量值从主内存传输到线程工作内存。 load:作用于工作内存,把read操作传过来变量值放入工作内存变量副本中。...DCL和部分初始化对象 为了解决这个问题,可以使用synchronized关键字将getInstance方法改为同步方法;但这样串行化单例是不能忍。...为了实现volatile内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型处理器重排序。...程序顺序规则目标对象是一段程序代码中两个操作A、B,其保证此处指令重排不会破坏操作A、B在代码中先后顺序,但与不同代码甚至不同线程中顺序无关。

    33140

    2020最全Java面试题--基础篇

    Java是与平台无关语言。 Java编译器将Java代码转换为可由JVM解释字节代码。 JVM为世界上几乎所有流行平台编写。 Java字节码可以相同方式在任何受支持平台上运行。...所有这些可移植性背后是Java字节码。 Java编译器生成字节码可以由任何JVM解释。 因此,用Java编写程序并期望它们可以在任何平台上运行变得容易得多。...我们可以将main方法写为public void static而不是public static void? 不,你不能这样写。 任何方法都必须首先指定修饰符,然后再指定返回值。...在OOPS中,聚合和组合是关联关系类型。 组合是强关系。 如果组合对象破坏,那么其所有部分都将被破坏。 例如。 汽车有方向盘。 如果Car对象破坏,那么方向盘就没有意义。...它行为就像复制一个构造函数。 它创建并返回对象副本,该对象具有相同类,并且所有字段值与原始对象值相同。 克隆一个缺点是返回类型是Object。 必须将其显式转换为实际类型。

    57831

    学过 C++ 你,不得不知这 10 条细节!

    在阅读 《Effective C++ (第三版本)》 书时做了不少笔记,从中收获了非常多,也明白为什么会书中前言第一句话会说: 对于书中「条款」这一词,更喜欢以「细节」替换,毕竟年轻我们在打...---- 细节 02 小结 - 请记住 将某些东西声明为 const 可帮助编译器探测出错误用法。const 可以施加于任何作用域内对象、函数参数、函数返回类型、成员函数本体。...赋值之后 p.m_Name 应该指向 s.m_Name 所指那个 string ?也就是说引用自身可被改动?如果是,那就开辟了新天地,因为 C++ 并不允许「让引用更改指向不同对象」。...如果不遵循它,代码一样可以通过编译,但是会破坏原本编程习惯。 ---- 细节 08 小结 - 请记住 令赋值操作符返回一个 reference to *this。...旧文里《C++ 赋值运算符'='重载(浅拷贝、深拷贝)》在规避这个问题试,就采用是方式 一,这个方式是不合适

    75020

    K2 编译器将在 Kotlin 2.0 中进入稳定状态 | 官方博客

    下文将详细描述 Kotlin 2.0 版本路线图、我们动力以及对它期望。 Kotlin 2.0 发布路线图是什么?...不过,对于软件程序,即使功能集基本保持不变,只要有内容大幅重写,表明大规模重做,就可以增大主要版本。虽然 Kotlin 是一种语言,但我们还是决定遵循这一软件做法。...Kotlin 规范: https://kotlinlang.org/spec/introduction.html 它会破坏代码? Kotlin 随着每个语言版本更新而变化。...它包括用于对代码进行语义分析 Kotlin 编译器前端副本,但这不是用于实际编译代码 Kotlin 编译器版本 – 编译器实际版本由构建文件中设置决定。...因此,通过 Kotlin 语言版本 2.0 编译代码时,您将使用新编译器前端并获得新编译器架构所有性能优势。但是,IDE 仍可能使用旧前端检查代码。

    1.8K30

    CC++ volatile

    使在main函数中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致...如果将变量i加上volatile修饰,则编译器保证对变量i读写操作都不会被优化,从而保证了变量i外部程序更改后能及时在原程序中得到感知。 (3)多线程应用中被多个任务共享变量。...3.volatile常见问题 下面的问题可以看一下面试者是不是直正了解volatile。 (1)一个参数既可以是const还可以是volatile?为什么? 是的。...一个例子是只读状态寄存器。它是volatile因为它可能意想不到地改变。它是const因为程序不应该试图去修改它。 (2)一个指针可以是volatile?为什么? 是的。...结果,这段代码可能返回不是你所期望平方值!

    1.8K31

    c++ thread探坑

    所以在joinable()为truethread变量离开作用域之前,可以通过调用join()或detach()来使joinable()为false,也可以通过移动来转移所有权。...--- 尽量不要让新线程访问到局部变量引用或指针 在新线程调用detach()情况下,创建线程函数可能会在线程执行完之前退出,局部变量所在占空间释放,并可能下一个函数使用,此时程序行为是不确定...thread过程实现了一次参数复制构造和移动构造,第一次复制构造在当前线程空间创建参数副本,第二次移动构造应该是在堆上创建了副本副本,所以最后离开作用域之后只有原变量和第一副本析构。...构造函数会在新线程刚开始调用函数时候返回。 --- 利用std::ref()在新线程中使用和修改原始参数 如前面所说,所有传入新线程函数参数都是原始参数副本,所以任何操作都不会对原变量产生影响。...c++编译器解析为函数声明,函数名my_thread,该函数返回一个thread对象,参数是一个函数指针,指向没有参数并返回T对象函数。

    1.2K100

    C++之父:C++确实很复杂,不和其他语言比较

    Bjarne对C++期望是其能作为一座桥梁,以便让程序员能够借助于它,从传统程序设计过渡到基于数据抽象和面向对象程序设计。 C++仅仅是一座桥梁? ?...还有,假定上面问题得到都是正面回答,那么在今后十年里,程序员们为那些并不关心C兼容性用户所做任何事情,都不会对那些始终关心这个问题的人们造成损害? 语言存在就是为了帮助开发者们解决问题。...当然,对多数机器系统结构,一个好汇编程序员总能做出比很好C++ 编译器还要小许多、快许多代码。 ?...这些类别并不是相互分离,它们也没有已经广泛接受定义。 C++ 将继续是所有这些领域中一个很好选择。...想,大部分产品代码程序员也应该可以。 ”特别值得提醒是,没有任何单独特征对于生产好代码而言是无可替代东西——无论你怎样给出“好”定义。”

    1.6K10

    十问泛型,你能扛住

    编译器可以很好地利用这个信息,当我们调用get时候,不需要再使用强制类型转换,编译器就知道返回值类型为String,而不是Object: String filename = files.get(0)...,打个比方:用泛型造了一个模型,具体填充什么样材质,由使用者去做决定。...extends Singer>子类型。 我们接下来来考虑另外一个问题,使用通配符会通过Couple引用破坏Couple?...这样做目的是为了让非泛型Java程序在后续支持泛型 jvm 上还可以运行(向后兼容) 当程序调用泛型方法时,如果擦除返回类型,编译器插入强制类型转换。...所以,我们要记住关于Java泛型转换几个点: 虚拟机中没有泛型,只有普通类和方法 所有的类型参数都用它们限定类型替换 桥方法合成来保持多态 为保持类型安全性,必要时插入强制类型转换

    1.1K10

    【笔记】《Effective C++》条款1-25

    上周看完了这本大名鼎鼎《Effective C++》,属实学到了很多技巧,本文是阅读途中做记录。...为了解决这个问题, 最好在程序最开始还是单线程启动时候在一个函数中有顺序地集中初始化所需所有static成员, 然后再启动多线程 2 构造/析构/赋值运算 5 了解C++默默编写并调用哪些函数 编译器会在类构造函数调用但是我们没有自己声明时自动创建...例如包含了引用成员类和包含const成员都不会生成默认拷贝构造函数 6 若不想使用编译器自动生成函数, 就该明确拒绝 拒绝编译器自动生成函数传统方法是自己声明一个private对应函数然后固定不去实现它..., 但是千万不能用拷贝函数调用拷贝函数, 这相当于试图构造一个已经存在对象, 很容易导致对象破坏....其它情况尽量都使用传引用, 因为大多数时候copy代价都大于指针, 且难以编译器优化 21 必须返回对象时, 别妄想返回其reference 返回对象引用时, 一定要记住引用只是别名, 底层是指针,

    1.1K30

    《逆袭进大厂》第三弹之C++提高篇79问79答

    1) C++异常情况: 语法错误(编译错误):比如变量未定义、括号不匹配、关键字拼写错误等等编译器在编译时能发现错误,这类错误可以及时编译器发现,而且可以及时知道出错位置及原因,方便改正。...这里未命名对象就是那些临时变量,甚至都不会有名称。典型未命名对象就是函数返回值或者类型转换对象。...对于这种情形可以很好工作,但是下面几种情形是不可以这么使用; 2) 类含有虚函数表:这么做会破坏虚函数表,后续对虚函数调用都将出现异常; 3) 类中含有C++类型对象:例如,类中定义了一个list...调用者不关心谁是调用者,所有它需知道,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)调用函数。 178、什么是一致性哈希?...它具有以下特点: 在给定文件系统中一个库只有一个文件,所有引用该库可执行目标文件都共享这个文件,它不会被复制到引用它可执行文件中; 在内存中,一个共享库 .text 节(已编译程序机器代码)一个副本可以不同正在运行进程共享

    2.2K30

    c++面试选择题_C语言经典笔试题

    格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 } 好处:在内存中不产生返回副本;(注意:正是因为这点原因,所以返回一个局部变量引用是不可取。...这条可以参照Effective C++[1]Item 31。虽然不存在局部变量被动销毁问题,可对于这种情况(返回函数内部new分配内存引用),又面临其它尴尬局面。...(3)可以返回类成员引用,但最好是const。这条原则可以参照Effective C++[1]Item 30。...如果其它对象可以获得该属性非常量引用(或指针),那么对该属性单纯赋值就会破坏业务规则完整性。...赋值操作符=,这个操作符象流操作符一样,是可以连续使用,例如:x = j = 10;或者(x=10)=100;赋值操作符返回值必须是一个左值,以便可以继续赋值。

    1.1K10

    inline: 理解还停留在20年前

    你好,是雨乐~ 在上篇文章访问私有变量——从技术实现角度破坏"封装"性一文中,在第二个实现示例中,用到了inline 变量,一开始,是懵逼,因为在印象中inline 仅仅函数,而在此处却用于声明变量...对于普通函数,编译器只把函数名称(对于c++来说,需要经过name mangling,毕竟运行函数重载,而C则不需要)和返回值记录在符号表里。...而对于inline函数(编译器确认可以inline),除上述函数名称和返回值之外,也将函数实现(究竟存放源代码还是编译后汇编指令就看编译器实现了)放在符号表中。...当遇到内联函数调用时,编译器首先检查调用是否正确(参数类型检查,返回结果是否正确使用——对于普通函数也进行这些检查),检查无误后将内联函数函数体替换掉对它调用,从而省去调用函数开销(参数入栈,...C++程序通常由多个C++源文件组成(.cc/.cpp等),编译器在进行编译时候,通常是将这些文件单独编译成模块或者目标文件,然后通过链接器将所有模块/目标文件链接到一个可执行文件或共享/静态库中。

    36710

    现代C++之SFINAE

    SFINAE概念只是为“健全”编译器保证这种“健全”行为。 所有的表达式都不会导致SFINAE。一个广泛规则是说功能/方法主体之外所有替代都是“安全”。...如果我们能处理一些编译时整数,我们不能做一些编译时比较? 答案是:绝对是的(当然可以比较),亲爱读者!...告诉过你,第二种解决方案隐藏了很多复杂性,我们仍然有很多c++ 11特性没有利用,比如nullptr、lambda、r-values。不用担心,我们将在c++ 14中使用其中一些。...5.C++14优势 5.2 auto与lambda 根据我XFCE环境右上角公历,我们是2015年!可以安全地在最喜欢编译器上打开C ++ 14编译标志,不是?...你已经拥有了所有你需要武器,现在开始与c++战斗吧! 最后! ! !我们有一个工作是有效,我们可以使用它序列化!

    2.9K20

    C++那些事之SFINAE

    SFINAE概念只是为“健全”编译器保证这种“健全”行为。 所有的表达式都不会导致SFINAE。一个广泛规则是说功能/方法主体之外所有替代都是“安全”。...如果我们能处理一些编译时整数,我们不能做一些编译时比较? 答案是:绝对是的(当然可以比较),亲爱读者!...告诉过你,第二种解决方案隐藏了很多复杂性,我们仍然有很多c++ 11特性没有利用,比如nullptr、lambda、r-values。不用担心,我们将在c++ 14中使用其中一些。...5.C++14优势 5.2 auto与lambda 根据我XFCE环境右上角公历,我们是2015年!可以安全地在最喜欢编译器上打开C ++ 14编译标志,不是?...你已经拥有了所有你需要武器,现在开始与c++战斗吧! 最后! ! !我们有一个工作是有效,我们可以使用它序列化!

    2.2K20

    c++入门】引用,内联函数,auto

    这意味着函数中对该参数任何修改都不会反映到原对象上。...这个返回副本通常是通过寄存器传递给函数调用者,在 main 函数中, int ret = func(); 一句捕获了 func 返回 a 副本,并将其存储在 main 局部变量 ret 中。...,消耗比较大 在c语言中,我们可以用宏来解决 #define Add(x,y) ((x)+(y)) 在c++中,可以通过在函数声明前添加关键字inline来指示编译器将一个函数视为内联函数 inline...这个变量将在每次循环迭代时初始化为序列中的当前元素。这里可以使用 auto 使编译器自动推断元素类型。 range:是您要遍历序列或容器,可以是数组、向量、列表等。...0 可能引起一些类型混淆或过载解析问题,nullptr 可用于任何需要空指针地方,与所有指针类型兼容,包括 C++ 基本类型指针、对象指针、函数指针以及成员函数指针 由于 nullptr 有自己类型

    11010

    闭关多日,整理一份C++中那些重要又容易忽视细节

    虚函数工作原理 友元 了解一下友元函数吧 友元函数是否破坏了类封装性 什么时候使用友元函数: ---- 基础篇 喜欢用内联函数?...3、调用函数从临时位置获取这个值 返回引用返回机制是这样: 1、获取返回值 2、直接将返回值拷贝给调用函数 如果返回值不大,那就不大,如果返回值是一个结构这种比较大东西,那就比较麻烦了,能明白意思不...但是,这几天尝试着了解了一下友元(主要是有几个大佬反复跟我说过,友元,要用),发现,学会友元,能让C++认识更进一步。所以我来了。...至于它是否破坏了类封装性,这个不同的人有不同说法啦,认为它没有破坏封装性的人觉得只有类声明可以控制哪些函数可以访问内部数据。...非成员函数可以访问类中公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏特性。

    59310
    领券