最近看caffe 代码, 有些头文件中 ,直接实现了该函数。 以前了解到是 头文件尽量不要实现, 放到cpp中实现, 短小的程序也可以实现。但是为什么这样,头文件实现有什么优缺点不是很清晰。基于这个,这篇博客重点在讨论 头文件实现函数的优缺点。
比如caffe 在layer.hpp中实现
emplate <typename Dtype>
inline void Layer<Dtype>::Backward(const vector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down,
const vector<Blob<Dtype>*>& bottom) {
switch (Caffe::mode()) {
case Caffe::CPU:
Backward_cpu(top, propagate_down, bottom);
break;
case Caffe::GPU:
Backward_gpu(top, propagate_down, bottom);
break;
default:
LOG(FATAL) << "Unknown caffe mode.";
}
}
// Serialize LayerParameter to protocol buffer
template <typename Dtype>
void Layer<Dtype>::ToProto(LayerParameter* param, bool write_diff) {
param->Clear();
param->CopyFrom(layer_param_);
param->clear_blobs();
for (int i = 0; i < blobs_.size(); ++i) {
blobs_[i]->ToProto(param->add_blobs(), write_diff);
}
}
} // namespace caffe
应该说要把接口和实现分离开来
或者把声明跟定义分离开来
私有的东西就不要暴露在头文件里啦, 头文件里只写接口