iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++常量合并的方法是什么
  • 549
分享到

C++常量合并的方法是什么

2023-06-17 08:06:25 549人浏览 薄情痞子
摘要

这篇文章主要介绍“c++常量合并的方法是什么”,在日常操作中,相信很多人在C++常量合并的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++常量合并的方法是什么”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“c++常量合并的方法是什么”,在日常操作中,相信很多人在C++常量合并的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++常量合并的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

下面是一个例子 APP.cpp文件中的 main 函数:

int main() { return 7 + 8; }

首先须知:

  1. 我们将从命令行来构建程序(而不是Visual Studio)

  2. 我们会使用Visual Studio 2012。 特别注意的是,这个版本的编译器会产生x64位代码(而不是已经过时的x86架构)在64位机子上编译。

如果你想要继续,请看下说明。实际上,你只需要从Visual Studio 列表里选择一个正确的变体。

(注意:如果你正在使用Visual Studio Express上的免费编译器,它仅仅只能运行在x86上,但是也会顺利生成x64的代码。对这个实验同样有用。)

我们可以通过命令 CL /FA App.cpp来构建示例程序。用/FA开关创建一个输出文件,用来保存编译器生成的汇编代码,可以输入type App.asm来显示:

PUBLIC  main _TEXT   SEGMENT main    PROC         mov     eax, 15         ret     0 main    ENDP _TEXT   ENDS END

有趣的是这条指令 move ax,15—-仅仅将15赋值给寄存器EAX(根据x64调用标准的定义,x64函数将会设置一个int值,作为函数的结果,并返回给调用者)。编译器运行期间并没有发出 7加8的指令。就像下面这样:

PUBLIC  main _TEXT   SEGMENT main    PROC         mov     eax, 7         add     eax, 8         ret     0 main    ENDP _TEXT   ENDS END

(注意看了,这两段代码的***一条指令,ret 0,是指将控制权返回给调用者,并从栈里弹出0个字节。不要被误导认为是返回数值0给调用者!)

我猜到,你可能在想:这很好啊,但是哪个白痴会想到在代码里写 7+8 这样的运算?的确,你是对的,但是编译器会把这样的结构看成是有副作用的宏。看了下面的例子,你就会明白常量合并是一个很有用的优化方法:

#define SECS_PER_MINUTE  60 #define MINUTES_PER_HOUR 60 #define HOURS_PER_DAY    24   enum Event { Started, Stopped, LostData, ParityError };   struct {     int        clock_time;     enum Event ev;     char*      reason; }   Record;   int main() {     const int table_size = SECS_PER_MINUTE * MINUTES_PER_HOUR * HOURS_PER_DAY * sizeof Record;     // rest of program }

我们要创建一个足够大的表保存每一秒的记录,所以table_size就是表的大小,用字节表示。很容易查看变量table_size的汇编指令:

mov     DWord PTR table_size$[rsp], 1382400     ; 00151800H

这儿没有乘法指令,60*60*24*16=1382400 是在编译时计算的。

事实上,我们窥探下编译器的内部,会发现这种常量合并的运算非常简单,它是由前端来执行的。它并不需要后端优化器笨重的提升能力。所以它总是存在的。不管你是开启优化(使用 /O2)或者关闭优化(/Od)都没什么区别—–该优化总是自动执行的。

不管表达式有多复杂,我们都能在编译期间进行常量合并吗?&mdash;事实上,前端可以处理任意的常量算术表达式(甚至包括上面提到的sizeof,只要它们在编译时能被计算出来)和运算符(+ - * / % << >> ++ 和 &ndash;)。你甚至可以使用布尔值,逻辑运算符 和条件运算符if AND ?:。

有没有常量合并需要后端优化器的时候呢?当然有,看下面的例子:

int bump(int n) { return n + 1; }     int main() { return 3 + bump(6); }

输入命令cl /FA /Od App.cpp,会得到信息:不能优化,谢谢!,输入 App.asm,我们会得到:

mov     ecx, 6 call    ?bump@@YAHH@Z                           ; bump add     eax, 3

正如我们所预料的: ECX会保存***个参数6,根据x64调用约定,然后调用bump函数,结果返回给EAX,然后EAX再加3。

我们来看看如果我们使用 cl /FA /O2 App.cpp 来进行优化,会发生什么。

mov eax,10

到此,关于“C++常量合并的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C++常量合并的方法是什么

本文链接: https://www.lsjlt.com/news/287909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++常量合并的方法是什么
    这篇文章主要介绍“C++常量合并的方法是什么”,在日常操作中,相信很多人在C++常量合并的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++常量合并的方法是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • c语言合法常量判断的方法是什么
    在C语言中,常量是固定的值,不能被修改。判断一个常量是否合法可以通过以下方法:1. 根据常量的数据类型进行判断:C语言中有多种数据类...
    99+
    2023-10-20
    c语言
  • 什么是c语言合法的常量
    在 c 语言中,合法的常量必须:类型明确:整数、浮点数或字符。值有效:在类型范围内。无副作用:值不依赖于程序执行。表示形式包括:整型、浮点、字符、字符串常量和转义序列。 什么是 C 语...
    99+
    2024-04-13
    c语言 字符串常量
  • c语言字符串合并的方法是什么
    在C语言中,可以使用strcat()函数将两个字符串合并在一起。该函数的原型如下: char *strcat(char *dest,...
    99+
    2024-04-02
  • c语言常量定义的方法是什么
    在C语言中,常量可以使用#define预处理器指令或使用const关键字来定义。 使用#define定义常量: #define ...
    99+
    2024-03-07
    c语言
  • mysql合并列的方法是什么
    在MySQL中,可以使用CONCAT()函数来合并列。CONCAT()函数用于将两个或多个字符串合并为一个字符串。以...
    99+
    2024-05-08
    mysql
  • sqlserver合并列值的方法是什么
    在SQL Server中,合并列值的方法可以使用CONCAT函数或+操作符来实现。 使用CONCAT函数: SELECT C...
    99+
    2024-04-09
    sqlserver
  • mongodb多表合并的方法是什么
    在MongoDB中,通常是通过使用聚合管道来合并多个集合。聚合管道可以用来对多个集合进行连接、筛选、排序和其他处理操作。 下面是一个...
    99+
    2024-04-09
    mongodb
  • python合并列表并排序的方法是什么
    Python中合并列表并排序的方法有多种,下面列举了几种常见的方法: 使用"+"运算符合并列表,并使用sort...
    99+
    2024-02-29
    python
  • sql合并字符串的方法是什么
    在 SQL 中合并字符串的方法有多种,具体取决于所使用的数据库管理系统。以下是一些常见的方法: 使用 CONCAT 函数: CO...
    99+
    2024-04-08
    sql
  • mysql合并字符串的方法是什么
    在 MySQL 中,可以使用 CONCAT() 函数合并两个或多个字符串。例如: SELECT CONCAT...
    99+
    2024-04-09
    mysql
  • oracle合并行数据的方法是什么
    Oracle中合并行数据的方法有以下几种: 使用聚合函数:可以使用SUM、COUNT、AVG等聚合函数来合并行数据。例如,可以使...
    99+
    2024-04-09
    oracle
  • java两个list合并的方法是什么
    可以使用addAll()方法将一个列表的所有元素添加到另一个列表中,从而实现两个列表合并。示例如下: List<String&...
    99+
    2024-03-05
    java
  • laravel常用集合方法是什么
    本篇内容主要讲解“laravel常用集合方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“laravel常用集合方法是什么”吧!laravel常用集合方法有:filter()、search...
    99+
    2023-06-29
  • tensorflow定义常量的方法是什么
    在 TensorFlow 中定义常量可以使用 tf.constant() 函数,示例如下: import tensorflow as...
    99+
    2024-04-02
  • c++捕获异常的方法是什么
    在C++中,可以使用try-catch块来捕获异常。试图在try块中执行代码,如果发生异常,则会立即跳转到与异常类型匹配的catch...
    99+
    2023-09-14
    c++
  • oracle列合并成一行的方法是什么
    在Oracle中,可以使用LISTAGG函数将一列的多个行值合并成一行。 语法如下: LISTAGG(column_name, se...
    99+
    2024-04-09
    oracle
  • Python三维数组合并的方法是什么
    要合并三维数组,可以使用numpy库中的concatenate方法。该方法可以沿指定的轴将两个或多个数组合并在一起。 以下是一个示例...
    99+
    2024-04-02
  • access多表合并查询的方法是什么
    在多表合并查询中,我们可以使用以下方法来访问所需的数据: 使用 JOIN 子句:使用 JOIN 子句将两个或多个表合并在一起,然...
    99+
    2024-04-02
  • Win10合并硬盘分区的方法是什么
    本篇内容介绍了“Win10合并硬盘分区的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!鼠标右击“此电脑”,选择“管理”在弹出的管理...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作