static_cast 到相同类型会引入运行时开销吗?

2024-05-13

我有一个结构模板,有两种类型(T and S),并在某些时候使用static_cast从一种类型转换为另一种类型。经常出现这样的情况T and S是同一类型。

设置的简化示例:

template <typename T, typename S = T>
struct foo
{
  void bar(T val)
  {
    /* ... */
    some_other_function(static_cast<S>(val));
    /* ... */
  }
};

在这种情况下S是同一个班级T, 是否或可以static_cast引入额外的开销,或者它是一个总是被忽略的空操作?

如果它确实引入了开销,是否有一个简单的模板元编程技巧来执行static_cast仅在需要时,或者我需要创建部分专业化来应对T == S案件?我宁愿避免整个的部分专业化foo如果可能的话,模板。


是的,它可以。

这是一个例子:

struct A {
  A( A const& ) {
    std::cout << "expensive copy\n";
  }
};

template<typename T>
void noop( T const& ) {}
template <typename T, typename S = T>
void bar(T val)
{
  noop(static_cast<S>(val));
}
template <typename T>
void bar2(T val)
{
  noop(val);
}
int main() {
  std::cout << "start\n";
  A a;
  std::cout << "bar2\n";
  bar2(a); // one expensive copy
  std::cout << "bar\n";
  bar(a); // two expensive copies
  std::cout << "done";
}

基本上,一个static_cast可以诱导调用复制构造函数。

对于某些类型(例如int),复制构造函数基本上是免费的,编译器可以消除它。

对于其他类型,则不能。在这种情况下,复制省略也不合法:如果您的复制构造函数有副作用,或者编译器无法证明它没有副作用(如果复制构造函数不平凡,则很常见),它将被调用。

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

static_cast 到相同类型会引入运行时开销吗? 的相关文章

  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • C# 反序列化过程中创建指向父对象的指针

    我有这样的课程 Serializable public class child public Parent parent Serializable public class Parent public List
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些

随机推荐

  • TypeScript 循环元组数组

    如何在 TypeScript 中循环元组数组 例如 for const x y of a 1 b 2 y 1 抱怨 error TS2365 Operator cannot be applied to types string number
  • 阻止原始框架“null”访问跨原始框架 - chrome

    我是 Javascript 新手 正在通过一本重点介绍其在 IE 7 和 Firefox 2 中应用的教科书来学习基础知识 但是 我正在使用 Chrome 并且在运行书中给出的程序时出现以下错误 阻止了原点 null 的框架访问跨源框架 谁
  • 在 Jade 模板中包含 SVG xml

    是否可以创建一个 Jade mixin 它从文件系统读取文件 并将其回显到渲染的 HTML 中 我试过这个 mixin svg file var fs require fs var xml fs readFileSync file div
  • wcf json网络服务

    创建 JSON Web 服务的最佳方法是什么 我们还有另一个使用 Java 的团队 他们坚持使用 JSON 完成所有通信 我更喜欢使用 WCF 而不是任何第三方框架 我找到了这个博客 http www west wind com weblo
  • Python Twisted 和数据库连接

    我们的工作项目包括同步应用程序 短期 和异步 Twisted 应用程序 长期 我们正在重构我们的数据库 并将构建一个 API 模块来解耦该模块中的所有 SQL 我想创建该 API 以便同步和异步应用程序都可以使用它 对于同步应用程序 我希望
  • 参数绑定的名称不能为 null 或为空!对于命名参数,您需要在 Java 版本上使用 @Param 来查询方法参数

    这之前已经发布过 但我的问题有点不同 这是有问题的 JPQL 查询 Query SELECT NEW com htd domain ShopOrder po id po po number po due date po part id po
  • 如何使用 python 在白色背景上裁剪图像?

    我正在扫描旧照片 因此我有来自扫描仪的图像和白色背景 我的目的是拍照 去除白色背景 我怎样才能做到这一点 An example picture is the following 我的简单方法 import os import time fr
  • AngularJS 控制器等待响应(或设置回调)

    我有一个带有controllers js 和factories js 的AngularJS 应用程序 我喜欢用控制器中的值 我从工厂获得 做一些事情 我的问题是 当我访问这些值时它们是空的 我怎样才能等待回复 或者在哪里可以添加回调 Fla
  • Django:出于测试目的阻止互联网连接

    我想确保我的单元测试不会尝试连接到互联网 有没有办法在连接时引发异常 有一个类似的问题Python 出于测试目的阻止网络连接 https stackoverflow com questions 18601828 python block n
  • 弹出表单可见,但 Puppeteer 中缺少 html 代码

    我目前正在尝试从网站获取一些信息 https www bauhaus info https www bauhaus info 并在 cookie 弹出表单中失败 到目前为止 这是我的代码 async gt const browser awa
  • Django - 找不到静态文件

    我看过有关此问题的几个帖子 但没有找到我的解决方案 我正在尝试在 Django 1 3 开发环境中提供静态文件 这是我的设置 STATIC ROOT home glide Documents django cbox static STATI
  • 对 CSV 行使用小写函数

    我正在尝试以小写形式打印 csv 中的所有数据 但我没有任何运气 这是我到目前为止所拥有的 import csv books csv reader open books csv rb for row in books print row 这
  • 如何获取 Minecraft 会话 ID?

    我正在尝试制作 Minecraft 客户端 但不知道如何获取会话 ID 来启动游戏 我已经做了一些谷歌搜索 但无论如何都找不到从中获取它这个答案从命令行启动 Minecraft 用户名和密码作为前缀 https stackoverflow
  • 文件名字符导致打开失败:EINVAL(无效参数)

    我想创建一个文件名采用以下格式的文件 DAY MONTH YEAR HOUR MINUTE但是当我使用 or and 我越来越open failed EINVAL例外 我试图逃离这些字符 但没有快乐 是否有禁止的文件名字符列表 String
  • Android:如何按设备类型(平板电脑、手机)设置强制设备方向?

    我需要根据设备类型设置力方向设备 以使用相关视图 平板电脑为横向视图 移动设备为纵向视图 旋转无法在设备上更改 因为我想在应用程序启动期间设置所有活动的方向 所以我认为我应该识别主活动中的设备类型 该活动由与视图相关的其他活动扩展 请问我怎
  • 如何在 switch 语句中将向量作为参数传递

    我对问题的谷歌搜索没有返回有用的结果和文档 switch没有告诉我如何做 所以我希望我能在这里得到答案 假设我有一个向量 cases lt c one two three 我想使用 switch 语句并将这些元素作为 switch 语句的参
  • PHP 将页面生成的标题放入

    我们在网站的所有页面中包含一个 header php 文件 因此 我们可以在 header php 文件中放置一个标题 该标题将应用于整个站点 或者在每个页面中添加一个自定义标题以更具描述性 问题是 这样做时 标题将位于 head 标签之外
  • 使用“actioncolumn”时如何执行视图控制器分离(Ext.grid.column.Action)

    在 ExtJS 4 中 我有一个包含操作列的网格 每当触发该操作时 我想执行 我的操作 如果没有 MVC 这将如下所示 xtype gridpanel columns xtype actioncolumn items handler fun
  • 导入邻居模块时如何正确使用导入

    我的项目目录看起来是这样的 project moduleA a py init py moduleB b py init py 在文件a py中我想从b py导入函数 pycharm建议我这样做 file a py from moduleB
  • static_cast 到相同类型会引入运行时开销吗?

    我有一个结构模板 有两种类型 T and S 并在某些时候使用static cast从一种类型转换为另一种类型 经常出现这样的情况T and S是同一类型 设置的简化示例 template