【发布时间】:2011-06-27 21:59:25
【问题描述】:
我有一个 C++ 库(包含 50 多个源文件),它使用大量 STL 例程,主要容器是列表和向量。这导致了巨大的代码膨胀,我想通过在列表和向量上创建一个包装器来减少代码膨胀。
下面显示的是我对 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
【问题讨论】:
-
也许我遗漏了一些东西,但如果 wlist 最终拥有一个列表,这将如何减少代码膨胀?您仍然必须为 wlist 中使用的每种类型实例化一次列表模板。
-
@templatetypedef - 将公开一个非模板化的 wlist 类帮助???
-
@codebin- 它会,但是你会失去模板的所有好处(编译时类型安全、自动内联和优化等)这里没有灵丹妙药的解决方案 - 你是要么为你使用的模板付费,要么你不打算使用模板。您可以尝试减少您拥有的不同模板实例化的数量,但最终每个实例化都会影响代码大小。
-
对于初学者,我会检查这是否真的是来自 STL 的代码膨胀 - 您是否在打开优化和关闭调试的情况下进行编译?其次,STL 本身会进行很多此类优化,因此您自己做的事情可能没有帮助。就像我说的 - 减少模板代码大小的唯一保证方法是使用更少的模板。如果你想缩小代码,然后找到你不需要 STL 容器的地方并用其他东西替换它。否则真的没有一个好的、可移植的方法来解决这个问题。
-
@codebin,使用函子和其他 stl 算法(例如
for_each)。