gpt4 book ai didi

c++ - 通过包装容器减少 STL 代码膨胀

转载 作者:搜寻专家 更新时间:2023-10-31 00:46:33 24 4
gpt4 key购买 nike

我有一个 C++ 库(包含 50 多个源文件),它使用大量 STL 例程,主要容器是列表和 vector 。这导致了巨大的代码膨胀,我想通过在列表和 vector 上创建一个包装器来减少代码膨胀。

下面显示的是我对 std::和包装实例的包装。

template<typename T>
class wlist
{
private:
std::list<T> m_list;

public:

// new iterator set.
typedef typename std::list<T>::iterator iterator;
typedef typename std::list<T>::const_iterator cIterator;
typedef typename std::list<T>::reverse_iterator reverse_iterator;

unsigned int size () { return m_list.size(); }
bool empty () { return m_list.empty(); }
void pop_back () { m_list.pop_back(); }
void pop_front () { m_list.pop_front(); }
void push_front (T& item) { m_list.push_front(item); }
void push_back (T item) { m_list.push_back(item); }
iterator insert(iterator position, T item) {m_list.insert(position,item);}
bool delete_item (T& item);
T back () { return (m_list.empty()) ? NULL : m_list.back();}
T front () { return (m_list.empty()) ? NULL : m_list.front();}
iterator erase(iterator item ) { return m_list.erase(item); }
iterator begin() { return m_list.begin(); }
iterator end() { return m_list.end(); }
reverse_iterator rbegin() { return m_list.rbegin(); }
};

文件A:

class label {

public:

int getPosition(void);
setPosition(int x);

private:

wlist<text*> _elementText; // used in place of list<text> _elementText;

}

文件 B:

class image {

private:

void draw image() {
wlist<label*>::iterator currentElement = _elementText.begin();
((label*)(*currentElement))->getPosition();
currentElement ++;
}
}

我的信念是,通过包装 STL 容器,我能够减少代码膨胀,但代码大小的减少似乎微不足道,而我包装 STL 的动机是实现大约 20% 的代码减少。

1) 通过公开“包装的”迭代器,我是否反过来将 STL 嵌入到我的客户端代码中,从而否定了我试图做的所有代码保存????2) 我是否选择了正确的分析方法????

修改前的尺寸:

$ size libWrap.so

text: 813115
data: 99436
bss: 132704
dec : 1045255
hex: ff307

修改后的大小:

$ size libWrap.so

text: 806607
data: 98780
bss: 132704
dec : 1038091
hex: fd70b

最佳答案

首先,您的包装器提供的界面完全令人厌恶。迭代器存在是有原因的,这是因为您的实现完全不适用于非指针类型。按值而不是按引用返回和获取?糟糕的设计。

其次,您永远不能通过引入更多代码来减小程序的大小。您的包装器仍在后台使用 STL 列表,因此您仍在实例化所有这些类型。最有可能的是,编译器完全删除了所有内容。

第三,您甚至没有进行等效替换,因为您已经用指针列表替换了以前的值列表,引入了 600 万终身头痛和其他问题。

第四,即使是代码膨胀的想法在绝大多数平台上也是相当荒谬的。当然,我无法从心理上知道你不是在几乎没有任何内存的嵌入式平台上工作(尽管我怀疑你会在这样的平台上使用很多列表)但实际上在每个系统上,代码本身的大小相比之下是没有意义的到程序执行所需的其他 Assets 。

可以做的是尝试类似 SCARY 迭代器或 T* 的偏特化之类的东西。

关于c++ - 通过包装容器减少 STL 代码膨胀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com