【发布时间】:2018-12-03 14:05:31
【问题描述】:
给定 vector 指向类对象的指针,在现代 C++ 中更改对象成员数据的“首选”(最有效/性能/简洁)方法是什么?当然,我可以使用for 循环来迭代vector,但是将for_each 与lambda 表达式一起使用会是更好的选择吗?还有其他更好的方法吗?
例如,假设我们有 vector<Person*> successfulPeople 和 Person 类,其中包含两个成员变量 bool isHappy 和 isRich 需要将所有 @987654331 从 false 更改为 true @successfulPeople 中的对象。
【问题讨论】:
-
为什么你认为任何东西都会比 for 循环更高效?
-
ranged-for 是“最好的”,因为它最容易维护
-
嗯,部分展开的循环、SIMD 或并行(线程)循环都可以比简单循环更有效。但是 C++ 优化器非常擅长转换代码(它们可以自动执行展开和 SIMD,以及只需一点点
#pragma omp parallel的并行循环),如果你不得不问这个问题,编译器几乎肯定比它更擅长优化它你会的。 -
@PhysicsCodingEnthusiast:没有什么可以改进的。您问题的基础是过早的优化。以正确且相当直接/惯用的方式编写代码;如果它被证明太慢,那么找出它太慢的地方然后处理它。事实上,我对你的代码最关心的不是那种循环。事实上,您正在循环访问该数据的 指针 数组,这很可能会破坏缓存的一致性。如果这是性能关键代码,那么第 1 步是直接使用
vector<Person>。 -
@NicolBolas 我已经有了一个完整的、可以工作的代码,并且对一些方面有疑问,并且想在我认为我可以改进的领域进行磨练——因此,这个问题。同样,一个原因是因为我习惯于在
Mathematica代码中不鼓励使用for循环,所以我对此感到好奇。我觉得问什么被认为是“简单”/“显而易见”的问题真的会扼杀好奇心和羞耻,这真的很不幸。指针向量的原因是因为我有一个唯一指针的主向量,这是一个包含对象子集的向量。
标签: c++ performance vector c++17