基本类型的 C++ 类包装器

2023-12-20

我见过/使用的许多库都有 typedef 来提供可移植的、固定大小的变量,例如 int8、uint8、int16、uint16 等,无论平台如何,它们都是正确的大小(并且 c++11 本身使用头文件 stdint.txt 来实现)。 H)

最近在我正在编写的一个小库中使用二进制文件 i/o 之后,我可以看到以这种方式使用 typedef 来确保代码可移植的好处。

但是,如果我要麻烦地键入“namespace::uint32”而不是使用内置的基本类型,那么我也可以使替换尽可能有用。因此我正在考虑使用类而不是简单的 typedef。

这些包装类将实现所有普通运算符,因此可以与基本类型互换使用。

Eg:

int x = 0;
//do stuff

可能成为

class intWrapper {
//whatever
};

intWrapper = 0;
//do stuff

无需修改“//do stuff”中的任何代码

我考虑这种方法而不只是 typedef 的原因是我已经有了对基本类型进行操作的函数,例如

std::string numberToString(double toConvert);

std::string numberToHexString(double toConvert);

int intToXSignificantPlaces(const int& number, 
                               unsigned char numberOfSignificantPlaces);

bool numbersAreApproximatelyEqual(float tollerance);
//etc....

从语法上讲,执行以下操作会更好(而且更多):

intWrapper.toString();
intWrapper.toHexString();
//etc

它还允许我实现 bigint 类(int128 等),并让这些类和较小的类(基于基本类型)使用相同的接口。

最后,每个包装器都可以有一个名为 max 和 min 的静态实例,因此 int32::max 和 int32::min 的良好语法是可能的。

但是,在执行此操作之前,我想解决一些问题(因为它主要是语法糖,并且这些类型的使用非常普遍,任何额外的开销都可能会对性能产生重大影响)。

1)当使用 someClass.operator+()、someClass.operator-() 等而不是 int a + int b 时,是否有任何额外的函数调用开销?如果是这样,内联运算符+()会消除所有这些开销吗?

2)所有外部函数都需要原始类型,例如glVertex3f(float,float,float)不能简单地传递3个floatWrapper对象,有没有办法自动让编译器将floatWrapper转换为float?如果是这样,对性能有影响吗?

3)是否有额外的内存开销?我理解(?)具有继承的类具有某种虚拟表指针,因此使用稍微多一点的内存(或者只是用于虚拟函数?),但假设这些包装类不是从子类继承的/不是子类,则没有“使用类而不是基本类型会增加任何额外的内存使用吗?

4) 这是否会导致任何其他问题/性能影响?


1)使用 someClass.operator+() 时是否有任何额外的函数调用开销

不,如果函数体很小并且位于标头中,它将被内联,并且没有开销

2)有没有办法自动让编译器将floatWrapper强制转换为float?

struct floatWrapper {
    floatWrapper(float); //implicit conversion from float
    operator float(); //implicit conversion to float.  
};

同样,如果函数体很小并且位于标头中,它将被内联,并且没有开销

3)是否有额外的内存开销?

如果没有虚函数则不会。一个类叫做多态性如果它声明或继承任何虚函数。如果类不是多态的,则对象不需要包含指向虚函数表的指针。此外,不允许将继承层次结构中的非多态类的指针/引用执行动态转换为派生类的指针/引用,因此对象不需要具有某种类型信息。

4) 这是否会导致任何其他问题/性能影响?

表现?不。

另外,请确保实现不会将 lhs 修改为自由函数的二元运算符,并重载它们以支持所有相关的排列floatWrapper and float.

struct floatWrapper {
    explicit floatWrapper(float);
    operator float(); //implicit conversion to float.  
    floatWrapper operator-=(float);
};
floatWrapper operator-(floatWrapper lhs, floatWrapper rhs) 
{return lhs-=rhs;}
floatWrapper operator-(float lhs, floatWrapper rhs) 
{return floatWrapper(lhs)-=rhs;}
floatWrapper operator-(floatWrapper lhs, float rhs) 
{return lhs-=rhs;}

这是我对这样的事情的尝试 http://coliru.stacked-crooked.com/view?id=f5566f15c11c52e2db7189d602cc601a-f674c1a6d04c632b71a62362c0ccfc51。请注意,对于 float/double/long double,您需要稍微不同的版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基本类型的 C++ 类包装器 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何从 R 中的 xlsx 文件中检测“删除线”样式

    我必须检查包含 的数据删除线 在 R 中导入 excel 文件时的格式 我们有什么方法可以检测到它们吗 欢迎使用 R 和 Python 方法 R 溶液 the tidyxl 包可以帮助你 例如 temp xlsx 其中数据位于第一张纸的 A
  • 如何在 Eclipse 中使用 Android 操作系统 VirtualBox 作为设备

    我在这里找到了有关如何运行 Android 操作系统的教程 http www javacodegeeks com 2010 06 install android os on pc with html http www javacodegee
  • jQuery 文档.ready

    我对 jQuery 中的 document ready 有点困惑 你什么时候在里面定义javascript函数 document ready 什么时候不呢 将所有 javascript 代码放入 document ready 中是否足够安全
  • gnuplot 文件有标准的文件扩展名吗?

    我见过 gnu plt and gplot作为 gnuplot 脚本的文件扩展名 我知道 Linux 不关心文件扩展名 但是什么扩展名最普遍地向人类声明 我是一个 gnuplot 脚本 正如罗曼 珀森博士和尼尔布都指出的那样这篇维基教科书文
  • 使用 XSD 架构进行 Xml 验证

    以下代码帮助我使用 XSD 架构验证 XML 文件 XmlReaderSettings settings new XmlReaderSettings settings Schemas Add null xsdFilePath setting
  • WCF 路由服务 - 动态错误处理

    我正在了解 WCF 路由服务可以做什么 仍处于 摆弄它看看它能做什么 阶段 我对路由服务的理解是 当消息通过时 该服务将尝试将其传递到备份列表中首先出现的端点 如果失败 它将继续尝试下一个 然后再尝试下一个 直到有东西起作用或者没有什么可以
  • opencv中的手动灰度太慢

    注意 我必须手动执行此操作 因此不建议我使用库函数 cvtColor 我是 opencv 的新手 我正在尝试使用以下公式对彩色图像进行灰度化 r g b r g b r g b 3 这是我转换为灰度的方法 C Mat dst src clo
  • 为什么 sizeof(int) 不大于-1? [复制]

    这个问题在这里已经有答案了 这是我的 C 代码 为什么输出为 False 为什么 4 gt 1 code include
  • NoMethodError: # 的未定义方法“[]”

    我是 Ruby on Rails 的新手 我正在使用omni auth 进行 facebook 和 google 身份验证并陷入困境 当我运行 rake db migrate 时 显示以下错误 rake aborted NoMethodEr
  • “Using”关键字调用基类构造函数

    我有以下基类 class Grammateas public Grammateas std string name name name virtual Grammateas private std string name 以及以下派生类 c
  • 从 Linux 用户空间设置 16550A UART 硬件 FIFO 中断级别

    我目前正在使用 16550 兼容的 UART 并且我希望能够更改 FIFO 中断触发级别 我在高 UART 负载下丢失字节 并且我想降低阈值 这是一个动力不足的嵌入式系统 当然 如果我愿意 我可以在 8250 port c 驱动程序中更改它
  • c++ 如何运行内容存储在字符数组中的.exe文件?

    我正在制作一个特定的程序 我只是想知道我是否可以这样做 运行一个文件 其内容存储在 WINDOWS 上的字符数组中 这是读取可执行文件并将其存储在字符数组中的代码 filetoopen open C blahlbah exe ios bin
  • React.memo - 为什么我的相等函数没有被调用?

    我有一个父组件 它根据通过 props 接收到的数组来渲染子组件的集合 import React from react import PropTypes from prop types import shortid from shortid
  • Ruby openssl 中的 AES 等效项?

    Gibberish 库提供了一个很好的 CBC 算法 In Jascascript GibberishAES enc Made with Gibberish n password Outputs U2FsdGVkX1 21O5RB08bav
  • android 动画后按钮不起作用

    我在 android 中创建了一个视图 我需要从下到上对其进行动画处理 反之亦然 我已经使用 TranslateAnimation 成功地做到了这一点 但问题是我的视图上有几个按钮 当动画出现时 触摸点保留在原始位置并且不会移动到新位置 因
  • List 是指针吗?

    我注意到的行为List
  • 始终位于顶部窗口

    我正在寻找一种解决方案 以便使 JFrame 始终处于顶部 并且 始终 我真正的意思是 始终 setAlwaysOnTop true 当我以全屏模式启动游戏时 这将不起作用 我知道您通常不希望窗口保持在顶部 但在这种情况下这是必需的 这是不
  • cdk虚拟滚动问题

    有没有人遇到过 Angular 7 cdk 虚拟滚动在 mat tab 组中工作异常的问题 https github com angular material2 issues 13981 https github com angular m
  • jQuery 分页插件

    希望这是很容易解决的问题 我在理解上遇到了一些问题jQuery 分页 http plugins jquery com project pagination plugin 本质上 我想做的就是加载 PHP 文件 然后对结果进行分页 我试图摆脱
  • 基本类型的 C++ 类包装器

    我见过 使用的许多库都有 typedef 来提供可移植的 固定大小的变量 例如 int8 uint8 int16 uint16 等 无论平台如何 它们都是正确的大小 并且 c 11 本身使用头文件 stdint txt 来实现 H 最近在我