`
febird
  • 浏览: 256600 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

泛型就意味着代码膨胀?

    博客分类:
  • C++
阅读更多

我所了解的泛型实现,也就C++和Java,C++靠的是用代码膨胀来满足性能,Java泛型则只是一个Sugar。

现在使用C++泛型的人越来越多,生成的程序体积也越来越大。一个对10种数据和10种算子使用了泛型算法的程序,代码膨胀的最大可以达到100倍。但实际上,生成的代码“很模板”。现在的C++还没有C++0x 的 closure/auto 等功能,代码膨胀已经达到了很恐怖的程度。——比如使用了 Boost.asio 的程序尺寸就很恐怖。

现在,代码膨胀虽然已经是一个很引起大家注意的问题,但是还没有让大家足够注意。虽然有一些减少代码重复的技巧,但那只是技巧而已,对问题的映射不是很直接,有一定难度,不能得到大范围的应用。可以预见,等到C++0x出世,泛型的语法更加优美,使用更加方便,大家的积极性更高,到那时,代码膨胀可能会成为一个非常残酷的现实问题。

应该有一些途径减少代码膨胀,现代的虚拟机(例如Java虚拟机和.Net虚拟机)可以通过动态优化来提高程序性能,先在运行时解释执行ByteCode,当发现某段ByteCode的执行频率太高时将它优化成NativeCode,这是一种很好的解决方案,虽然在解释执行时增加了程序计数的开销,但这是微不足道的。静态编译语言如C++能否吸收它的优点呢?

我觉得也许可以,但是代价可能比较高。比如对同一个泛型算法实例化100次时,是否可以只生成一个内部框架,而在运行时,用到了哪个实例,再实例化那个泛型算法,也就是运行时由RuntimeEnv按需动态生成NativeCode,而不是在编译时一次生成。对于泛型类型,也类似。实际上,也许有些泛型算法的实例根本不会在执行路径上出现,但是静态编译却必须为它生成代码。

 

分享到:
评论

相关推荐

    解析Java泛型的类型擦除.pdf

    这意味着,在 Java 语言中,泛型类型信息仅存在于编译阶段,而在运行阶段,它们已经被擦除。 例如,在 Java 中,我们可以定义一个泛型类 `ArrayList<T>`,其中 `T` 是类型参数。在编译阶段,编译器会检查所有的代码...

    C#泛型详细介绍与实例说明(详细)

    这意味着该类可以存储任何类型的对象,但同时也可能导致类型安全问题。 - **GenericClass**:这是一个泛型类,使用类型参数`T`来代替`object`。这种设计方式确保了类型安全,并且可以根据具体需求实例化不同的类型。...

    VC++ 2005系列课程(7):泛型编程

    泛型编程的核心在于其类型参数化,这意味着可以创建泛型函数或泛型类,这些实体可以处理任何类型的数据,只要满足特定的约束条件即可。这种抽象级别的提升,使得泛型代码能够在多种上下文中复用,提高了代码的效率...

    泛型需要注意的问题.pdf

    这意味着不能在运行时直接查询一个对象是否为某个特定泛型类型的实例,例如`arrayList instanceof ArrayList<String>`这样的表达式是不允许的。因为类型擦除后,所有泛型类型的集合在运行时都简化为原始类型。 泛型...

    快速了解泛型(C#,JAVA,C++)

    与C#不同,Java的泛型是擦除的,这意味着在编译后的字节码中,类型参数会被替换为它们的边界类型(通常是`Object`)。但是,这并不影响编译时的类型检查。以下是一个简单的Java泛型示例: ```java public class Box...

    深入分析:C++模板究竟会使代码膨胀吗

    总的来说,C++模板的确可能导致代码膨胀,但这并不意味着它一定会导致不可接受的文件大小。通过精心设计的模板、模板特化、CRTP以及编译器优化,可以有效地管理和减小代码膨胀的影响。在ATL和WTL中,这种平衡使得...

    开源项目-golang-proposal.zip

    然而,这种方法往往会导致代码膨胀,增加理解难度,同时在编译时无法检查类型错误。例如,当需要一个能够处理多种整型的函数时,程序员可能需要为每种整型编写一个函数,这无疑增加了维护成本。 提案"Go should ...

    C++中用函数模板实现和优化抽象操作

    这意味着模板本身不是可执行的代码,而是一种生成代码的蓝图。编译器在处理模板代码时,需要根据模板的定义和用到的类型生成特化版本,然后将这些特化版本的代码嵌入到最终的可执行文件中。 总结来说,C++中的函数...

    高质量C++编程 高质量C++编程

    这意味着我们需要遵循一致的命名规则,如CamelCase或snake_case,以及适当的注释和文档编写,以便他人能轻松理解代码。同时,合理地使用头文件和命名空间可以避免命名冲突,提高代码的模块化。 其次,掌握设计模式...

    Effective C++.zip

    8. **异常安全编程**:异常处理是C++中的重要特性,编写异常安全的代码意味着即使在异常发生时也能保持数据一致性。书中介绍了异常安全级别的概念,并给出了实现方法。 9. **命名空间与作用域**:命名空间有助于...

    C++Templates.rar

    这种编译时多态性使得模板成为C++中的高效工具,但也可能导致代码膨胀,尤其是在大量使用模板时。 模板的特化是另一个重要概念,允许开发者为特定的数据类型提供定制的实现。这在模板默认行为不能满足需求时非常...

    自己实现的哈希表c++template

    描述中提到的“用字符串做key的哈希表”,意味着这个哈希表特别优化了对字符串键的支持。在C++中,字符串通常由`std::string`类型表示。字符串作为键在很多实际应用中非常常见,因为它们可以方便地表示文本数据。...

    高质量C++

    "高质量C++"是每个C++程序员追求的目标,它意味着编写出的代码不仅功能完善,而且具有良好的性能、可读性、可维护性和安全性。本篇文章将深入探讨如何实现高质量C++编程,同时,这些原则同样适用于其他编程语言。 ...

    高质量C++编程指南

    1. **内存管理**:C++允许直接控制内存,但这也意味着程序员需要处理内存泄漏和悬挂指针等问题。理解动态内存分配(如`new`和`delete`)以及智能指针(如`std::unique_ptr`, `std::shared_ptr`)的使用是提高代码...

    src_themselves9sm_effectiveC++_zip_

    12. **模板的使用和陷阱**:模板能实现泛型编程,但也可能导致代码膨胀和编译时错误。了解何时和如何使用模板是必要的。 13. **异常安全编程**:理解异常在C++中的角色,编写能够正确处理异常的代码,确保资源管理...

    第七节 模板(Templates).docx

    在使用模板时,需要注意的是,由于模板的代码是在编译时生成的,所以可能会导致代码膨胀,即编译后的可执行文件增大。不过,对于性能而言,模板通常比运行时的类型检查和转换更快,因为它们是静态类型的。 总的来说...

    C++Templates.zip

    展开的结果是与模板实例化类型相关的具体代码,这意味着模板代码只在编译时存在,运行时没有模板的概念。 7. 引用折叠(Reference Collapsing): 在模板参数中,如果同时有引用和右值引用,C++会进行引用折叠。...

    Effective C++

    9. **内联函数与命名空间**:内联函数用于优化代码,减少函数调用的开销,但过度使用可能导致代码膨胀。命名空间用于避免名字冲突,提高代码可读性。 10. **多态与虚函数**:虚函数是实现动态多态的基础,理解其...

    高质量C++编程指南_C++_

    编写异常安全的代码意味着即使在异常发生时,程序的状态也能保持一致。了解异常规范,如基本异常安全和强异常安全,可以确保程序的稳定性。 3. **模板和泛型编程**:C++的模板机制支持泛型编程,能实现代码复用。但...

    高质量C++编程 c++ 编程 高质量 编程 进阶

    在C++编程中,高质量意味着代码的可读性、可维护性、效率和安全性。以下将对这些关键点进行深入探讨: 1. **对象导向设计**:C++是面向对象的语言,理解类、对象、封装、继承和多态是基础。高质量的C++代码会充分...

Global site tag (gtag.js) - Google Analytics