【发布时间】:2019-06-23 18:34:09
【问题描述】:
我正在尝试通过不跟踪指针来优化一段代码,就像我现在一样。我想创建一个常量偏移量以添加到存储的指针以获取下一个数据条目,请参见下面的代码。但是,数据位于类或结构旁边,包含不同的数据类型。
所以我在下面的代码sn-p中得到了正确的行为,即输出为1、2、3。
#include <iostream>
#include <vector>
// knows nothing about foo
class Readfoo
{
private:
int offset;
double* pdouble;
public:
void SetPoint(double* apdouble, int aoffset)
{
offset = aoffset;
pdouble = apdouble;
};
const double& printfoo(int aidouble) const
{
return *(pdouble + offset*aidouble);
};
};
// knows nothing about readFoo
struct foo
{
int a[5];
double b[10];
};
int main()
{
// populate some data (choose b [2] or other random entry.).
std::vector<foo> bar(10);
bar[0].b[2] = 1;
bar[1].b[2] = 2;
bar[2].b[2] = 3;
// access b[2] for each foo using an offset.
Readfoo newReadfoo;
newReadfoo.SetPoint(&(bar[0].b[2]), sizeof(foo)/sizeof(double));
for(int ii = 0; ii < 3; ii++)
{
std::cout<<"\n"<<newReadfoo.printfoo(ii);
}
return 0;
}
我的问题有两个:
- 这段代码真的合法吗?它会产生未定义的行为吗?
- 如果不合法,有没有办法在不存储实际指针的情况下,通过 foo 访问 b[2] 进行迭代,在上述情况下,使用某种形式的常量偏移量(例如在起始位置之间添加位数)每个数据条目的地址。)?
【问题讨论】:
-
真的很好奇:你有任何证据表明你的代码比简单地访问
bar[i].b[2];表现更好 -
顺便说一句,标题有点误导,因为您没有迭代结构的成员,但是在迭代向量中的元素时总是访问相同的成员
-
嗯,又看了一遍,标题其实还不错(还是会被误解)
-
你为什么要用指针算法做你正在做的事情?你试图用它解决的真正的问题是什么?数组访问代码仍将作为指针算术代码生成(对于任何数组或指针
a和索引i,表达式a[i]完全 等于*(a + i))。 -
让我高度怀疑您的代码是否真正优化的原因是您没有使用任何编译器也无法使用的信息。如果编译器为您的代码发出相同的输出以及使用向量
operator[]编写的相同循环,我实际上不会太惊讶
标签: c++ pointers iteration heap-memory