【发布时间】:2016-11-11 00:39:37
【问题描述】:
我正在创建一个示例来尝试了解在使用 c++11 时如何优化移动语义。
首先,我有以下两个函数,它们接受一些输入并返回输入的修改版本。
std::vector<float> abs(const std::vector<float> &v)
{
std::vector<float> abs_vec = v;
for (auto &val: abs_vec) {
auto i = &val - &abs_vec[0];
abs_vec[i] = std::abs(abs_vec[i]);
}
return abs_vec;
}
std::vector<float> normalize(const std::vector<float> &v)
{
std::vector<float> norm_vec = v;
auto max_val = std::max_element(std::begin(norm_vec), std::end(norm_vec));
auto min_val = std::min_element(std::begin(norm_vec), std::end(norm_vec));
auto norm_factor = *max_val;
auto min_check = std::abs(*min_val);
if (min_check > std::abs(norm_factor)) {
norm_factor = min_check;
}
for (auto &val: norm_vec) {
auto i = &val - &norm_vec[0];
norm_vec[i] = norm_vec[i] / norm_factor;
}
return norm_vec;
}
然后我用下面的代码测试函数:
int main()
{
std::vector<float> tmp{-1,2,-3,4,5};
printf("pointer before: %p\n", &tmp[0]);
tmp = normalize(tmp);
printf("pointer after normalize: %p\n", &tmp[0]);
tmp = abs(tmp);
printf("pointer after abs: %p\n", &tmp[0]);
};
从这里我得到输出:
pointer before: 0x156dc20
pointer after normalize: 0x156e050
pointer after abs: 0x156dc20
谁能解释一下发生了什么以及为什么我在标准化后得到了一个副本,但在 abs 函数调用之后却与原始的内存位置相同?
有没有更好的方法以这样的函数式风格编写函数,从而产生更优化的代码?
【问题讨论】:
标签: c++ c++11 functional-programming move-semantics