现代C++ 教程:高速上手C++11/14/17/20templatevoid magic(Ts... args) { std::cout << sizeof...(args) << std::endl; } 我们可以传递任意个参数给 magic 函数: magic(); // 输出 0 magic(1); // 输出 1 magic(1, ""); // 输出 2 其次,对参数进行解包,到目前为止还没有一种 能够处理参数包,但有两种经典的处理 手法: 1. 递归模板函数 26 2.5 模板 第 2 章语言可用性的强化 递归是非常容易想到的一种手段,也是最经典的处理方法。这种方法不断递归地向函数传递模板参 数,进而达到递归遍历所有模板参数的目的: #include template void printf1(T0 value) { std::cout // 100 作为模板参数 28 2.6 面向对象 第 2 章语言可用性的强化 在这种模板参数形式下,我们可以将 100 作为模板的参数进行传递。在 C++11 引入了类型推导这 一特性后,我们会很自然的问,既然此处的模板参数以具体的字面量进行传递,能否让编译器辅助我们 进行类型推导,通过使用占位符 auto 从而不再需要明确指明类型?幸运的是,C++17 引入了这一特性, 我们的确可以 0 码力 | 83 页 | 2.42 MB | 1 年前3
《深入浅出MFC》2/e软件开发领域?C/SDK?抑或C++/MFC?这一直是个 引起争议的论题。就我个人观点,C++/MFC 程序设计必须跨越四大技术障碍: 1. 对象导向观念与C++ 语言。 2. Windows 程序基本观念(程序进入点、消息流动、窗口函数、callback...)。 3. Microsoft Foundation Classes(MFC)本身。 4. Visual C++ 整合环境与各种开发工具(难度不高,但需熟练)。 窗口焦点(拥有焦点之窗口,将可获得键盘输入) 以下是本书使用之中英文名词对照表: 控制组件,如 拖放(鼠标左键按下,选中图标后拖动,然后放开) 图标(窗口缩小化后的小图样) 串行 列表框、列表清单 通告消息(发生于控制组件) 强制性、先占式、优先权式 进程(一个执行起来的程序) 队列 template C++ 有所谓的class template,一般译为类别模板; Windows 有所谓的dialog 斜体字表示函数、常数、变量、语言保留字、宏、识别码等等,例如: CreateWindow 这是Win32 函数 strtok 这是C Runtime 函数库的函数 WM_CREATE 这是Windows 消息 ID_FILE_OPEN 这是资源识别码(ID) CDocument::Serialize 这是MFC 类别的成员函数 m_pNewViewClass 这是MFC 类别的成员变量 BEGIN_MESSAGE_MAP0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程这时 future 对象 的类型为 std::future。 • 同理有 std::promise ,他的 set_value() 不接受参数,仅仅作为同步用, 不传递任何实际的值。 第 3 章:互斥量 多线程打架案例 • 两个线程试图往同一个数组里推数据。 • 奔溃了!为什么? • vector 不是多线程安全( MT-safe )的容 器。 • 多个线程同时访问同一个 果不需要,在 wait() 返回后调用 lck.unlock() 即可。 • 顺便一提, wait() 的过程中会暂时 unlock() 这个锁。 案例:实现生产者 - 消费者模式 • 类似于消息队列…… • 生产者:厨师,往 foods 队列里推送食品 ,推送后会通知消费者来用餐。 • 消费者:等待 foods 队列里有食品,没有 食品则陷入等待,直到被通知。 条件变量:将 foods 0 码力 | 79 页 | 14.11 MB | 1 年前3
面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭150 200 250 300 不编译 编译 报告数 编译流程融合静态分析 分布式编译与分析 大量使用缓存 提升静态分析的理论速度 如何做到10分钟反馈分析结果 系统地改进分析时间 编译流程 分析流程 依赖关系分析 分布式 编译 分布式 分析 分布式链接 跨模块分析 报告整合 缓存 缓存 缓存 缓存 硬核玩家:从理论上改进静态分析能力0 码力 | 39 页 | 6.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理&pig • 这样传递的就是 pig 对象的常引用,从而 实际只传递了一个指针,避免了拷贝。 • 常见的有 std::vectorconst &arr 等。 • 注:有的教材喜欢这样: const Pig &pig ,仅仅是个人喜好不同,没有实际区 别。 函数参数类型优化规则:按引用还是按值? • 如果是基础类型(比如 int , float )则按值传递: • float , Object * )则按值传递: • void doSomethingWith(Object *ptr); • 如果是数据容器类型(比如 vector , string )则按常引用传递: • int sumArray(std::vector const &arr); • 如果数据容器不大(比如 tuple ),则其实可以按值传递: • glm::vec3 vec3 pos); • 如果是智能指针(比如 shared_ptr ),且需要生命周期控制权,则按值传递: • void addObject(std::shared_ptr 0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南因此,如果发现一个项目里的 add_library 都是无参数的,意味着你可以用 : cmake -B build -DBUILD_SHARED_LIBS:BOOL=ON 来让他全部生成为动态库。稍后会详解命令行传递变量的规则。 小技巧:设定一个变量的默认值 要让 BUILD_SHARED_LIBS 默认为 ON ,可以用下图这个方法: 如果该变量没有定义,则设为 ON ,否则保持用户指定的值不变。 这样当用户没有指定 变量的传播规则:父会传给子 • 父模块里定义的变量,会传递给子模块。 变量的传播规则:子不传给父 • 但是子模块里定义的变量,不会传递给父模块。 变量的传播规则:子不传给父 • 如果父模块里本来就定义了同名变量,则离开子模块后仍保持父模块原来设置的值。 如果子模块需要向父模块里传变量怎么办? • 可以用 set 的 PARENT_SCOPE 选项,把一个变量传递到上一层作用域(也就是父模 块)。 如果子模块需要向父模块里传变量怎么办?0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针• func(int arr[6]) • 那么他其实就等价于: • func(int* arr) • 也就是说,给函数参数传入一个数组,实 际上等同于传入他的首地址指针,本质上 属于按引用传递。 C 语言特性:函数声明为 T [] 类型的参数,实际上是 T * 类型 • 你可能在网上看过 sizeof(a) / sizeof(a[0]) 来获取数组长度的“炫酷技巧”,然而那只适 func(int* arr) ,索性 摆明了这就是个指针,避免混淆。 • 如果你真需要传入一个数组而不是数组的首 地址指针,用 C++ 的 std::array。 • 这是按值传递的,里面的修改不会变化外面 的值,符号小白程序员的思维,避免 C 语 言指针和数组的那些难以理解的坑。 字符串的本质究竟是什么? ASCII 字符对照表:把字符对应到 0~127 的整数,方便用计算机存储 0 码力 | 128 页 | 2.95 MB | 1 年前3
Hello 算法 1.0.0b4 C++版等)都不支持自动优化尾递归,因此一般来说空间复杂度是 ?(?) 。 � 函数和方法这两个术语的区别是什么? 函数(function)可以独立被执行,所有参数都以显式传递。方法(method)与一个对象关 联,方法被隐式传递给调用它的对象,方法能够对类的实例中包含的数据进行操作。 因此,C 和 Go 只有函数,Java 和 C# 只有方法,在 C++, Python 中取决于它是否属于一个类。 随着计算机的蓬勃发展,字符集与编码标准百花齐放,而这带来了许多问题。一方面,这些字符集一般只定 义了特定语言的字符,无法在多语言环境下正常工作;另一方面,同一种语言也存在多种字符集标准,如果 两台电脑安装的是不同的编码标准,则在信息传递时就会出现乱码。 那个时代的人们就在想:如果推出一个足够完整的字符集,将世界范围内的所有语言和符号都收录其中,不 就可以解决跨语言环境和乱码问题了吗?在这种想法的驱动下,一个大而全的字符集 Unicode0 码力 | 343 页 | 27.39 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程很像)。所以,不可能从 kernel 里 通过返回值获取 GPU 数据,因为 kernel 返回 时核函数并没有真正在 GPU 上执行。所以核函 数返回类型必须是 void 。 试图解决:通过指针传递 • 那你可能会想,既然不能返回,那作为指 针传入局部变量的引用,不就好了。 • 这样,在 cudaDeviceSynchronize() 以后 ,应该可以获取数据了吧? • 结果令人失望,尽管给0 码力 | 142 页 | 13.52 MB | 1 年前3
Hello 算法 1.1.0 C++ 版Go、C# 等)不支持自动优化尾递归,因此通常认为空间复杂度是 ?(?) 。 Q:函数和方法这两个术语的区别是什么? 函数(function)可以被独立执行,所有参数都以显式传递。方法(method)与一个对象关联,被隐式传递给 调用它的对象,能够对类的实例中包含的数据进行操作。 下面以几种常见的编程语言为例来说明。 ‧ C 语言是过程式编程语言,没有面向对象的概念,所以只有函数。但我们可以通过创建结构体(struct) 百花齐放,而这带来了许多问题。一方面,这些字符集一般 只定义了特定语言的字符,无法在多语言环境下正常工作。另一方面,同一种语言存在多种字符集标准,如 果两台计算机使用的是不同的编码标准,则在信息传递时就会出现乱码。 那个时代的研究人员就在想:如果推出一个足够完整的字符集,将世界范围内的所有语言和符号都收录其 中,不就可以解决跨语言环境和乱码问题了吗?在这种想法的驱动下,一个大而全的字符集 Unicode0 码力 | 379 页 | 18.47 MB | 1 年前3
共 14 条
- 1
- 2













