草庐IT

c++ - vector::operator[] 开销

显然,在分析我的(科学计算)C++代码后,25%(!)的时间花在调用vector::operator[]上。.没错,我的代码将所有时间都花在阅读和写作vector中。s(还有一些vectors),但我仍然想知道operator[]是否应该有一些显着的开销与C风格的数组相比?(我在SO上看到了另一个相关问题,但关于[]与at()——但显然,甚至[]对我来说都太慢了?!)谢谢,安东尼(编辑:仅供引用:在Ubuntu上使用g++-O3版本4.5.2) 最佳答案 在现代编译器中,在Release模式下,启用优化后,与原始指针相比,使用ope

c++ - C++中的可变长度数组开销?

看这个问题:WhydoesaC/C++compilerneedknowthesizeofanarrayatcompiletime?我突然想到,编译器实现者现在应该有一些时间来涉足(这是10年前的C99标准的一部分)并提供高效的实现。但是,它似乎(从答案中)仍然被认为是昂贵的。这让我有些吃惊。当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这还没有被测量;)]但我仍然对假定的成本感到惊讶:据我所知,如果函数中没有VLA,那么就不会产生任何成本。如果只有一个VLA,那么可以将它放在所有变量之前或之后,因此可以

c++ - C++中的可变长度数组开销?

看这个问题:WhydoesaC/C++compilerneedknowthesizeofanarrayatcompiletime?我突然想到,编译器实现者现在应该有一些时间来涉足(这是10年前的C99标准的一部分)并提供高效的实现。但是,它似乎(从答案中)仍然被认为是昂贵的。这让我有些吃惊。当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这还没有被测量;)]但我仍然对假定的成本感到惊讶:据我所知,如果函数中没有VLA,那么就不会产生任何成本。如果只有一个VLA,那么可以将它放在所有变量之前或之后,因此可以

c++ - C++ 中的 RTTI 开销

在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次

c++ - C++ 中的 RTTI 开销

在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次

c++ - 没有虚函数的 C++ 继承开销

在C++中,与继承没有虚函数的基类相关的开销(内存/cpu)是多少?和直接复制+粘贴类(class)成员一样好吗?classa{public:voidget();protected:int_px;}classb:publica{}对比classa{public:voidget();protected:int_px;}classb{public:voidget();protected:int_px;} 最佳答案 与复制和过去相比,使用继承时可能会有轻微的内存开销(由于填充),请考虑以下类定义:structA{inti;charc1;}

c++ - 没有虚函数的 C++ 继承开销

在C++中,与继承没有虚函数的基类相关的开销(内存/cpu)是多少?和直接复制+粘贴类(class)成员一样好吗?classa{public:voidget();protected:int_px;}classb:publica{}对比classa{public:voidget();protected:int_px;}classb{public:voidget();protected:int_px;} 最佳答案 与复制和过去相比,使用继承时可能会有轻微的内存开销(由于填充),请考虑以下类定义:structA{inti;charc1;}

c++ - 如何衡量函数的调用开销?

我想测量和比较不同函数调用的开销。在处理扩展类同时最小化代码修改的两种替代方法的意义上有所不同:使用抽象基类并在虚拟成员函数中提供实现使用策略宿主类并使用静态和成员函数定义不同的策略这两个选项都与根本不调用函数进行了比较。我也知道NVI设计支持动态多态的类时通常使用的惯用语——我使用的示例只是开销的基准。这是我尝试用于此目的的代码:#include#include#include#include#includeclassInterface{public:virtualdoublecalculate(doublet)=0;virtual~Interface()=default;};cla

c++ - 如何衡量函数的调用开销?

我想测量和比较不同函数调用的开销。在处理扩展类同时最小化代码修改的两种替代方法的意义上有所不同:使用抽象基类并在虚拟成员函数中提供实现使用策略宿主类并使用静态和成员函数定义不同的策略这两个选项都与根本不调用函数进行了比较。我也知道NVI设计支持动态多态的类时通常使用的惯用语——我使用的示例只是开销的基准。这是我尝试用于此目的的代码:#include#include#include#include#includeclassInterface{public:virtualdoublecalculate(doublet)=0;virtual~Interface()=default;};cla

c++ - GCC 中的 std::string 实现及其短字符串的内存开销

我目前正在为低内存平台开发一个应用程序,该应用程序需要一个包含许多短字符串(>100,000个字符串,每个字符串包含4-16个字符)的std::set。我最近将此集合从std::string转换为constchar*以节省内存,我想知道我是否真的避免了每个字符串的所有开销。我尝试使用以下方法:std::stringsizeTest="testString";std::cout但它只是给了我一个4个字节的输出,表明该字符串包含一个指针。我很清楚字符串在内部将数据存储在char*中,但我认为字符串类会产生额外的开销。std::string的GCC实现是否比sizeof(std::strin