在C++的类中构造数组的解决方案~

来源:百度知道 编辑:UC知道 时间:2024/05/15 06:20:44
在类里面封装数组是很简单的问题,只要数组的基类类型有默认构造函数就可以了,但是性能问题怎么解决捏?高手可以给个完整的解决方案没?谢谢哈~为了使问题更清楚,举例如下:#define SIZE 100class base{ int _d;public : base():_d(0){} base(int d):_d(d) {} virtual ~base(){}};struct foo{ foo(){} /*好像只能做这么多了,如果要声明一个带有参数的构造函数就只能在函数体里面给出赋值方案,初始化问题无法控制*/ template<class type> foo(const type &contain,const size_t size){ size_t index=0; while(index!=size){ //赋值 } }/*问题在于它初始化了一次并且还赋值了一次,性能问题很吐血,如果SIZE和base规模很可观应该怎么办?*/private: base arr[SIZE];};

你可以这样:
private中只要声明一个char* ptr(或者void* ptr);
然后一次性new一块 raw memory, 具体方法是ptr = new[ sizeof(Base)*SIZE];然后每增加一个base到数组中的时候再初始化, 具体方法是 Base* myBase = new(ptr) Base(10);//这里调用的构造函数是 base(int d):_d(d) {},然后再ptr = ptr + sizeof(Base);
这就解决了你所说的性能问题,当然,这里析构的时候就比较麻烦,你得要显式的先调用存放在内存块中的base析构函数,然后再delete掉内存块,使用delete[]

大概觉得你是新手,所以多说一句new(ptr) Base(10);这个是placement new

性能的问题取决于你的数据量,而不是程序本身。

所以有几种方案:
1,为了不过多调用构造函数,数据与操作分离。意思就是尽量用传统的 struct (最好作为内部类),然后另写一个内部类对该 struct 进行操作。
2,数组中不要放真实数据,而放指针。缺点是需要管理申请和释放的内存,内存的申请释放更是性能问题。
3,使用类似 std::vector 的容器。