C++编程技巧

这篇具有很好参考价值的文章主要介绍了C++编程技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

预处理器类

运行速度

#pragma GCC optimize("O3,unroll-loops")
这是编译器指令,告诉GCC编译器使用最大优化级别(O3)和循环展开(unroll-loops)进行编译,以提高程序的运行速度
例如:

#pragma GCC optimize("Ofast")
#include <iostream>
using namespace std;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int sum = 0;
    for(int i = 0; i < 5; i++){
        sum += arr[i];
    }
    cout << "The sum is " << sum << endl;
    return 0;
}

这会告诉编译器尽可能地优化代码以提高运行速度,有时候甚至会牺牲浮点数的精度。这里的程序是计算一个整型数组的所有元素的和,然后输出。

如果我们将其与没有优化指令的版本比较,可能会在大型数据集或者复杂的计算中看到明显的运行速度的差异。不过在小型程序和简单的计算中,可能看不出明显的区别。

指定CPU指令集

#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
:这个编译器指令指定编译目标的特性,例如avx2,bmi,bmi2,lzcnt,popcnt等都是特定的CPU指令集。这些指令能够提升一些特定运算的效率。
ex:

#pragma GCC target("sse4.2")

在这个例子中,#pragma GCC target(“sse4.2”)告诉GCC编译器生成的代码应当优化以利用SSE4.2指令集。SSE4.2是一种在现代x86处理器上用来加速某些类型的计算的指令集。

需要注意的是,如果你的程序运行的处理器不支持这些指令集,那么这个指令就可能会导致程序运行出错。因此,在使用这个指令时,你需要确保你的程序将要运行在支持这些指令集的处理器上。

IO

#define fast ios::sync_with_stdio(false); cin.tie(0);
:这是一个用于提高C++的输入/输出效率的宏

这行代码定义了一个预处理器宏,名为fast。这个宏涉及两个C++的输入/输出流库(iostream库)的特性,其目的是提升C++的输入/输出速度。

ios::sync_with_stdio(false);

这个调用会取消C++中的cin和stdout的同步。默认情况下,C++的cin和cout总是和C的stdin和stdout同步的,这种同步会使得C++的输入/输出操作有一些额外的开销。当我们知道在程序中不会同时使用C和C++的输入/输出操作时,可以关闭这种同步,以提高效率。

cin.tie(0);

这个调用将cin和cout的绑定取消。默认情况下,cin和cout是绑定在一起的,这意味着每次在用cin读取输入之前,都会先刷新cout的缓冲区,以保证在读取输入之前,所有待输出的内容都已经输出了。当我们知道在程序中不需要这种严格的输入/输出顺序时,可以取消这种绑定,以提高效率。

当你在代码中写fast;,预处理器会将其替换为ios::sync_with_stdio(false); cin.tie(0);。这种方式使得你在任何需要快速输入/输出的场景下,都可以简单地写fast;,而不是写完整的两行代码。

然后你可能会问,为什么fast后面还要跟一个分号?这是因为宏替换只是简单的文本替换,预处理器不会自动为你在宏替换后的代码添加分号。因此,你需要在使用fast时,像正常的C++语句一样在其后添加分号。

例如,你在代码中写fast;,预处理器替换后的代码将变为:

ios::sync_with_stdio(false); cin.tie(0);;
虽然这里看起来有两个连续的分号,但这并不会影响代码的正确性,因为C++允许空语句,即一个单独的分号。

循环

up
#define foru(i, k, n) for (int i = k; i < n; i++)
:这是一个用于简化代码的宏,用于创建从k开始,到n结束的for循环。
dowm
#define ford(i, k, n) for (int i = k; i >= n; i--)
:同样是一个用于简化代码的宏,用于创建从k开始,到n结束的倒序for循环。

这行代码的意思是,每当你在代码中写 foru(i, k, n),预处理器都会在编译代码之前,将其替换为 for (int i = k; i < n; i++)。这种方式可以简化代码,并提高代码的可读性。

宏 foru(i, k, n) 的参数是 i(循环变量的名称),k(循环的起始值),和 n(循环的终止值)。循环变量 i 的初始值是 k,并在每次迭代后递增1,直到达到 n 时循环结束。请注意,这个 for 循环是半开区间的,即包括起始值 k,但不包括终止值 n。
ex:

foru(i, 0, 5) {
    cout << i << " ";
}

typedef

typedef long long ll;
typedef unsigned long long ull;
这些都是类型别名,为了编程方便和简洁。

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef long double ld;
typedef vector<int> vi;
typedef pair<ld, ld> pld;

如果你有一个复杂的嵌套数据类型,如
std::map<std::string, std::vector<std::pair<int, int>>>
,那么你可能会希望为这个类型创建一个更简洁的别名。使用typedef,你可以这样做:

typedef std::map<std::string, std::vector<std::pair<int, int>>> MyComplexType;

MyComplexType myMap;

再来聊聊为什么#define后面不加分号,typedef后面加分号

#define是C和C++预处理器指令,用于定义宏,而typedef是C和C++关键字,用于定义类型别名。这两者在语法上有所不同。

#define:在C和C++中,预处理器将在编译过程开始之前处理所有的预处理器指令。#define就是一种预处理器指令,用于定义宏。预处理器会在编译过程开始之前替换所有宏定义。由于这些替换是在编译阶段之前完成的,因此#define不遵循C++的语法规则,不需要加分号。

typedef:在C和C++中,typedef是一个关键字,用于为类型定义别名。由于typedef是在编译阶段处理的,因此它必须遵循C++的语法规则,也就是说,必须在声明后面添加分号。

这就是为什么#define后面不加分号,而typedef后面要加分号的原因。文章来源地址https://www.toymoban.com/news/detail-453146.html

到了这里,关于C++编程技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式ARM设计编程(三) 处理器工作模式

    文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 (1) 通过实验掌握学会使用msr/mrs 指令实现ARM 处理器工作模式的切换,观察不同模式下的寄存器,加深对CPU 结构的理解; (2) 通过实验掌握ld 中如何使

    2024年02月03日
    浏览(66)
  • 『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]

    『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT] 辅助文档-本教程配套代码,以及更多范例和文档 :https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook Polygraphy:深度学习推理原型设计和调试工具包 介绍个工具Torch.Profiler,使用它来确定你的性能瓶颈

    2024年02月11日
    浏览(50)
  • ARM处理器运行Windows系统的三防加固平板|亿道三防

    大家好!今天我要为大家介绍一款引人注目的三防加固平板电脑——亿道三防系列产品。它们采用 高通ARM 处理器,并能够运行 Windows 11 操作系统,给用户带来了前所未有的强大性能和多样化的应用体验。 首先,让我们来聊聊这款平板电脑的核心亮点之一—— 超薄设计。 亿

    2024年02月22日
    浏览(67)
  • 解决MAC M1处理器运行Android protoc时出现的错误

    Protobuf是Google开发的一种新的结构化数据存储格式,一般用于结构化数据的序列化,也就是我们常说的数据序列化。这个序列化协议非常轻量级和高效,并且是跨平台的。目前,它支持多种主流语言,比传统的XML、JSON等方法更具优势。详细信息请参考:Google protocol buffer。但是

    2024年02月14日
    浏览(33)
  • DP读书:鲲鹏处理器 架构与编程(六)PCI Express 总线

    PCI Express(Peripheral Component Interconnect Express) 是一种高速串行计算机扩展总线标准,原来的名称为“3GIO”,是由英特尔在2001年提出的。PCIe属于 高速串行点对点双通道高带宽传输 ,所连接的设备分配独享通道带宽,不共享总线带宽, 主要支持主动电源管理,错误报告,端对

    2024年02月11日
    浏览(51)
  • DP读书:鲲鹏处理器 架构与编程(十一)鲲鹏生态软硬件构成

    鲲鹏处理器的软件生态是一个不断发展的软件生态,服务器本身也具有复杂度多样性,经过很长时间的发展服务器硬件有不同的操作系统方案,这些操作系统往往还实现了软件的分层组合,很难简单描述其 软件架构 。 本节从一个比较高的层次,主要从 GNU/Linux软件生态角度

    2024年02月11日
    浏览(42)
  • 【C++】做一个飞机空战小游戏(九)——发射子弹的编程技巧

     [导读]本系列博文内容链接如下: 【C++】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动 【C++】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C++】做一个飞

    2024年02月11日
    浏览(57)
  • DP读书:鲲鹏处理器 架构与编程(十)鲲鹏软件生态与云服务

    鲲鹏处理器 作为全方面兼容 ARMv8-AA64位体系结构 的通用服务器芯片,支持ARM+Linux生态 鲲鹏软件生态与云服务 鲲鹏作为通用的 ARMv8 处理器,属于全球ARM生态之中。当前鲲鹏不再仅仅局限于鲲鹏系列服务器芯片,更是包含了完整的 服务器软硬件生态和全栈的云服务生态 。 生态

    2024年02月11日
    浏览(44)
  • 【C++航海王:追寻罗杰的编程之路】探寻实用的调试技巧

    目录 1 - 什么是bug? 2 - 调试是什么?有多重要? 2.1 - 调试是什么? 2.2 - 调试的基本步骤 2.3 - Debug和Release的介绍 3 - Windows环境调试介绍 3.1 - 调试环境的准备 3.2 - 学会快捷键 3.3 - 调试的时候查看程序当前信息 3.3.1 - 查看临时变量的值 3.3.2 - 查看内存信息 3.3.3 - 查看调用堆栈

    2024年04月12日
    浏览(39)
  • DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优

    ACPI (Advanced Configuration and Power Interface) 是一种由英特尔、微软、惠普、索尼等公司共同开发的电源管理标准。它提供了一种通用的电源管理接口,用于管理计算机系统的电源状态、性能和配置等方面。 在计算机系统中, ACPI负责处理电源管理事件 ,例如系统启动、关机、休

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包