0

0

C++怎么使用std::ratio_C++编译时分数运算【详解】

尼克

尼克

发布时间:2026-03-12 17:50:03

|

529人浏览过

|

来源于php中文网

原创

std::ratio是编译期分数类型,不生成对象、不占内存,仅作为模板参数参与约分计算;用于duration定义时间单位或量纲,所有运算返回新ratio类型而非数值。

c++怎么使用std::ratio_c++编译时分数运算【详解】

std::ratio 是编译期分数,不是运行时类型

它不生成对象,也不占用内存,只在模板参数层面参与计算。你不能写 std::ratio r;,也不能对它取地址或传参(除非作为模板实参)。它的存在意义是让编译器在实例化模板时推导出约分后的分子分母。

  • 常见错误:试图用 std::ratio 做运行时除法,比如 r.num / r.den —— numden 是静态常量,但直接除会丢失精度且毫无编译期优势
  • 正确场景:配合 std::chrono::duration 定义时间单位,或自定义单位制(如物理量纲)
  • 注意 std::ratio 要求分母非零、分子分母为整型字面量,且最大公约数会被自动约简:std::ratio 等价于 std::ratio

std::ratio_add、std::ratio_sub 等运算必须用模板别名

这些不是函数,而是变量模板(C++14 起)或类模板(C++11),返回的是新的 std::ratio 类型,不是数值结果。你不能调它们来“算出一个浮点数”,只能用来构造新类型。

  • 错误写法:auto x = std::ratio_add<:ratio>, std::ratio>();</:ratio> —— 没有 operator(),编译失败
  • 正确写法:using r = std::ratio_add<:ratio>, std::ratio>;</:ratio>,此时 r::num == 5r::den == 6
  • 所有运算(ratio_addratio_multiplyratio_divideratio_subratio_equal)都要求结果可表示为整型比值;若中间计算溢出(如分子超过 std::intmax_t),行为未定义 —— 这是容易被忽略的硬限制

std::ratio 的溢出和编译器支持差异

不同编译器对大数 ratio 的处理不一致。GCC 和 Clang 在模板实例化阶段做算术,可能因常量表达式溢出报错;MSVC 有时会静默截断或给出模糊的“template instantiation depth”错误。

  • 典型错误信息:error: overflow in constant expressionerror: integer overflow in expression
  • 避免方式:不要用接近 std::intmax_t 边界的值构造 ratio;若需大数运算,改用 constexpr 函数 + std::int128_t(需编译器支持)手动实现
  • std::ratio 是合法的(表示 0/1),但 std::ratio 直接导致编译失败 —— 分母为零是硬性诊断,不是运行时异常

和 std::chrono::duration 的联动最容易踩空

std::duration 的第二个模板参数是 std::ratio,但它只控制“滴答周期”,不代表你能直接拿它做数学运算。比如 std::duration<int std::ratio>></int> 表示毫秒,但 d.count() * 1000 不等于微秒值,因为底层计数单位没变。

立即学习C++免费学习笔记(深入)”;

  • 常见误操作:把两个不同 ratioduration 直接相加,期望自动换算 —— 实际上会触发隐式转换,但前提是目标类型能精确表示源值,否则编译失败或静默截断
  • 安全做法:用 std::chrono::duration_cast 显式转换,例如 std::chrono::duration_cast<:chrono::microseconds>(ms)</:chrono::microseconds>
  • 注意 std::ratio 的精度完全由模板参数决定,没有舍入逻辑;如果源 duration 的 tick 无法被目标 ratio 整除(如从 1/3 秒转到 1/10 秒),duration_cast 会向零截断

事情说清了就结束。真正难的不是记住 ratio_multiply 怎么拼,而是意识到它从不产生运行时值——所有“计算”都在模板名字里完成了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1859

2024.08.15

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

69

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

37

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

82

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号