热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在C++中,是基类中的"公共unsignedint类型",是dynamic_cast的更快替代方案吗?

如何解决《在C++中,是基类中的"公共unsignedint类型",是dynamic_cast的更快替代方案吗?》经验,为你挑选了1个好方法。

在C++中,"dynamic_cast"缓慢是一个众所周知的事实.我想到了以下简单的方法来了解层次结构中对象的类型.有人可以解释一下这是否比dynamic_cast慢?如果不是,那么为什么不是普遍的做法,因为速度的C++对C最差的缺点?

struct Base {
  unsigned m_type;
  Base(unsigned type): m_type(type) {}
  Base(): m_type(0) {}
};
struct Derived1: Base {
  Derived1(): Base(1) {}
  Derived1(int type): Base(type) {}
};
struct Derived2: Base {
  Derived2(): Base(2) {}
};
struct Derived3: Derived1 {
  Derived3(): Derived1(3) {}
};
void my_func(Base * p) {
  if (p - > m_type == 0) {} 
  else if (p - > m_type == 1) {} 
  else if (p - > m_type == 2) {} 
  else if (p - > m_type == 3) {}
}

einpoklum - .. 7

有人可以解释一下这是否比dynamic_cast慢?

它可能比dynamic_cast'ing慢,当......

编译器可以弄清楚你是什么动态广播,从而避免为动态转换做任何事情.

Base衍生对象是不可改变的,允许各种优化的,而你的类包含一个可变类型变量.

你有一个庞大而复杂的类型层次结构,因此你需要进行大量的比较.

另外,您是否真的检查过dynamic_cast相对于您可能正在做的其他事情有多慢?

为什么不是常见做法[?]

    因为它使代码更复杂,添加了意想不到的潜在语义和特性,并且违背了语言的抽象机制.

    因为它需要基类知道它的所有派生类(否则你最终会重新实现动态转换).

    因为它使特定于类的代码的某些部分在类定义的本地,以及特定于类的代码的其他部分本地的基类.

...鉴于速度是C++优于C的最大缺点?

事实并非如此.现在很有可能(并且很常见)用C语言编写性能更好的代码而不是C语言中的语义代码.

但无论如何,这应该无关紧要,因为你没有业务在性能关键代码中进行动态转换; 正如@NathanOliver在评论中所暗示的那样,这是一个设计缺陷.



1> einpoklum - ..:

有人可以解释一下这是否比dynamic_cast慢?

它可能比dynamic_cast'ing慢,当......

编译器可以弄清楚你是什么动态广播,从而避免为动态转换做任何事情.

Base衍生对象是不可改变的,允许各种优化的,而你的类包含一个可变类型变量.

你有一个庞大而复杂的类型层次结构,因此你需要进行大量的比较.

另外,您是否真的检查过dynamic_cast相对于您可能正在做的其他事情有多慢?

为什么不是常见做法[?]

    因为它使代码更复杂,添加了意想不到的潜在语义和特性,并且违背了语言的抽象机制.

    因为它需要基类知道它的所有派生类(否则你最终会重新实现动态转换).

    因为它使特定于类的代码的某些部分在类定义的本地,以及特定于类的代码的其他部分本地的基类.

...鉴于速度是C++优于C的最大缺点?

事实并非如此.现在很有可能(并且很常见)用C语言编写性能更好的代码而不是C语言中的语义代码.

但无论如何,这应该无关紧要,因为你没有业务在性能关键代码中进行动态转换; 正如@NathanOliver在评论中所暗示的那样,这是一个设计缺陷.


推荐阅读
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • C语言学习笔记—链表(二)链表的静态添加及动态遍历
    链表的静态添加及动态遍历我们知道数组中的数据存储是有序的,而链表中的数据是无序的但是存在某种联系使之组成链表。那么我们如果向一组数据中添加一个数据元素, ... [详细]
  • AtonepointIhadlookedatimplementingaclasstemplateinC++thatwouldsupportanEnumthatwo ... [详细]
  • [置顶]        C++类的构造函数与析构函数的调用顺序
    1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 ... [详细]
  • 如何用Vscode和 Visual stdudio配置C++环境
    这篇文章主要讲解了“如何用Vscode和Visualstdudio配置C++环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深 ... [详细]
author-avatar
小song喪_774
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有