相关疑难解决方法(0)

显式实例化 - 何时使用?

几个星期休息之后,我正在尝试使用David Vandevoorde和Nicolai M. Josuttis 所着的模板 - 完整指南来扩展和扩展我的模板知识,我现在想要了解的是模板的显式实例化.

我实际上并没有这样的机制问题,但我无法想象我想要或想要使用此功能的情况.如果有人能向我解释,我将不仅仅是感激.

c++ templates

73
推荐指数
3
解决办法
5万
查看次数

在c ++/gcc中优化模板编译时间

在一个大型项目中,我们有很多类(数千个),并且对于每个类,使用typedef定义了一个特殊的智能指针类型.此智能指针类型是模板类.当我用"gcc -Q"编译时,我发现花了很多时间为每个类编译这些智能指针.这就是我看到smartptr<class1>::methods, then smartptr<class2>::methods... smartptr<class2000>::methods在gcc处理它们时在屏幕上滚动.

有加速这个过程的技巧吗?从smartptr的角度来看,这些类都是相同的,没有enable_if技巧等.

我现在正在尝试的事情:

  • 也许用很少的常用方法创建一个非模板基类
  • 使用extern模板类来减少链接符号(和实例化时间?还不确定)

但以上所有都不是一个完整的解决方案.我想知道是否有另一种方法可以优化编译时间,这是一个让gcc知道的技巧,例如,一旦它在看到其他特化时反复应用相同的知识就解析了smartptr,因为生成代码是相同的.

是的,我知道这是不是一样,当然......但是,这只是一个疯狂的想法.

或者也许还有其他我不知道的技巧,可以加快编译速度.(只是为了说明我正在谈论的内容,我们可以通过消除其静态成员数据实例来优化另一个模板,这大大减少了编译时间.这根本不明显.)

c++ linux gcc templates g++

17
推荐指数
1
解决办法
1321
查看次数

良好的C++数组类,以快速和内存有效的方式处理大型数据数组?

继上一个与堆使用限制相关的问题之后,我正在寻找一个好的标准C++类,以一种既节省内存又提高速度的方式处理大数据数据.我一直在使用单个malloc/HealAlloc分配数组,但是在使用各种调用的多个trys之后,继续犯下堆碎片.因此,除了移植到64位之外,我得出的结论是使用一种机制,允许我拥有一个跨越多个较小内存片段的大型数组.我不希望每个元素都有一个alloc,因为它的内存效率很低,所以计划是编写一个覆盖[]运算符的类,并根据索引选择一个合适的元素.是否已经有一个体面的班级来做这件事,或者我最好自己动手?

根据我的理解和一些谷歌搜索,32位Windows进程理论上应该可以解决高达2GB的问题.现在假设我已经安装了2GB,并且各种其他进程和服务占用大约400MB,你认为我的程序可以合理地期望从堆中获得多少可用内存?

我目前正在使用各种风格的Visual C++.

编辑 按照Poita的帖子,我尝试了一个std :: deque,在VS2008上使用以下测试;

#include <deque>
using namespace std;
struct V    
{
    double  data[11];
};

struct T
{
    long    data[8];    
};


void    dequeTest()
{
    deque<V> VQ;
    deque<T> TQ;

    V defV;
    T defT;

    VQ.resize(4000000,defV);
    TQ.resize(8000000,defT);
}
Run Code Online (Sandbox Code Playgroud)

上述数据的总内存为608MB,如果我使用直接malloc或HeapAlloc,则需要<1秒.deque resizes最初占用了950MB,然后慢慢开始退回.15分钟后,dequeTest()完成了,只使用了6MB的内存显示进程,这可能更多地与运行时间有关.我也尝试使用各种推送选项填充双端队列,但性能非常糟糕,我不得不提前爆发.我可以提供一个比defualt更好的分配器来获得更好的响应,但从表面来看,deque并不是这项工作的类.请注意,这也可能与deque的MS VS2008实现有关,因为在这个类中似乎有很多与性能相关的非常依赖于实现的实现.

我想,是时候写我自己的大数组了.

第二次编辑: 使用以下内容立即分配较小的数量,产生1.875GB;

#define TenMB 1024*1024*10

void    SmallerAllocs()
{

    size_t Total = 0;
    LPVOID  p[200];
    for (int i = 0; i < 200; i++)
    {
        p[i] = malloc(TenMB);
        if (p[i])
            Total += …
Run Code Online (Sandbox Code Playgroud)

c++ arrays visual-c++

8
推荐指数
2
解决办法
3306
查看次数

标签 统计

c++ ×3

templates ×2

arrays ×1

g++ ×1

gcc ×1

linux ×1

visual-c++ ×1