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

C++ 实用指南

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

52820

C 与 C++ 40 年的爱恨情仇

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

27720
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

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

    35030

    【C++篇】类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

    你的支持是我继续创作的动力! 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!...按值传递可以在函数内部修改参数副本,而不影响原始实参对象,也就是说形式参数无法影响实参,两个创建的对象指向不同空间。 当我们传递一个对象给函数时,编译器会为这个对象创建一个副本。...1.4.2 Visual Studio 2022激进优化 VS2022 的优化更加激进,它能够跳过对象的拷贝构造,直接传递原始对象的引用。通过内存重用和别名优化,编译器可以避免创建副本。...Visual Studio 2022 的激进优化则可以跳过拷贝构造,避免副本的创建。 2....相信通过这篇文章你对C++类与对象高级部分的有了初步的了解。如果此篇文章对你学习C++有帮助,期待你的三连,你的支持就是我创作的动力!!! 下一篇文章再会.

    9310

    volatile 关键字详解

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

    34340

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

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

    58331

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

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

    75520

    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.9K31

    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

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

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

    1.6K10

    c++ thread探坑

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

    1.3K100

    十问泛型,你能扛住吗?

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

    1.1K10

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

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

    2.2K30

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

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

    1.1K30

    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等),编译器在进行编译的时候,通常是将这些文件单独编译成模块或者目标文件,然后通过链接器将所有模块/目标文件链接到一个可执行文件或共享/静态库中。

    41910

    现代C++之SFINAE

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

    3K20

    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

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

    之前我们讲过指令重排序会破坏相干性,您可能会想:好吧,我不重排序了。但下面这种优化也会以一种微妙的方式破坏相干性——公共子表达式消除。...禁止这种因果关系的行为,并没有禁止其他期望的优化,这是令人惊讶的困难。… 经过许多提案和五年充满激情的辩论,当前的模式被批准为最佳妥协。...(摆烂呗就~) 现在的编译器和库在编写时没有考虑线程,它们以各种方式破坏着竞争。尽管还不清楚那些未修复的编译器和库是如何处理宽松的原子的,但要找到并修复所有的问题太难了,至少争论是这样的。...期望现有的为单线程世界编写的C++编译器来发现和修复这样的代码生成问题可能是不切实际的,但在新的语言中,我认为我们应该有更高的目标。...允许(可以说是鼓励)竟态读返回任何被实现允许的可能的不相关的值,这可能会导致在运行时泄漏私有数据。

    1.7K20
    领券