- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这是我经常遇到的问题,最后想听听大家对自己喜欢的风格的看法。
在构造函数中使用参数或成员(用于只读目的)是更好/首选的做法吗?例如,在这个简单的 vector 类中:
#include <iostream>
#include <array>
class SimpleDoubleVector {
private:
double * _data;
std::size_t _size;
public:
SimpleDoubleVector(double * data, std::size_t size) :
_size(size) {
_data = new double[size];
for (int k=0; k<size; ++k)
_data[k] = data[k];
}
~SimpleDoubleVector() {
delete[] _data;
}
};
是不是更好
size
(如图所示)或_size
,再使用_size
可能的后果:
哪个更具可读性?
哪个会提供更好的性能(或者由于 copy propagation 而它们是等价的)?直觉上,感觉从参数中读取会更有效率,因为它永远不会被写入,因此会导致更简单的 dependency graph。 .
我知道这可能看起来很迂腐,但它经常出现,我真的很想剖析最好的方法(或者至少更好地理解利弊)。
最佳答案
语义上,局部变量(以及参数)通常优于成员变量。以这个有点捏造的例子为例:
class Complex {
float real_;
float imag_;
public:
Complex& operator*=(const Complex& that) {
real_ = real_ * that.real_ - imag_ * that.imag_;
imag_ = imag_ * that.real_ + real_ * that.imag_;
}
};
乍一看不错,直到您意识到第一行中对 real_
的修改更改了第二行中 real_
的值。即使您捕获了它并将原始的 real_
存储在局部变量中,您也可能遇到 c *= c
的情况,其中左侧和右侧- 运算符(operator)的手边是别名,并且您在第一行中更改 real_
无意中更改了第二行中的 that.real_
。换句话说,对成员变量的更改能够导致对局部变量的更改不会产生的副作用。
在速度方面,任何合理的编译器都会发现两者相同。如果您重用该参数,不合理的编译器可能会产生更好的代码,因为它已经在本地并且编译器肯定知道除了它可以看到的代码之外没有任何东西可以改变该值。同样值得注意的是,稍微复杂的情况,即使是在好的编译器上,也会为这样的情况产生更糟糕的输出:
void MyClass::foo(int value, MyClass* child) {
value_ = value;
for (int i = 0; i < value_; ++i) {
if (child) child->value_ = i;
bar(i, child);
}
}
这个函数完全没有办法保证this
和child
是不同的指针。所以它不能在循环迭代之间将 value_
保存在寄存器中,因为对 child->value_
的赋值可能已经改变了 this->value_
。在这种情况下,即使是优秀的编译器也会希望看到您使用该参数。
在可读性方面,如果您认为成员(member)名称前后的下划线(或 m_
,就此而言)使其不可读,那么您为什么要使用那个符号?构造函数体和普通函数体之间的一致性绝对是可取的。所以我会争辩说,如果你的语义鼓励在函数的持续时间内将成员变量拉入局部变量,那么也在构造函数中这样做(只需使用参数)。但是,如果在您的其他成员函数中没有使用这样的约定,那么也不要在构造函数中这样做——让编译器来处理它。
关于C++ 风格 : use parameter or member in constructor body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11219101/
当调用 func didBegin(_ contact: SKPhysicsContact) 的 SKScene 中发生接触时,需要确定哪个 SKPhysicsBody 是contact.bodyA
HTML: CSS: body { width : 1000px ; } header { width : 100% ; } 如果有这样的代码, 我认为页眉的宽度将与主体的
我刚刚通过网站完成设计,现在我正在尝试将整个 body 布置成一个整体,而不是不断重复的瓷砖。请问我该怎么做? 我不确定我说的是否有道理,但就像一张墙纸在拉伸(stretch),而不是 30 个小瓷砖
我试图在我的内部包装器上获得一个滚动条,而不是主体本身: CSS body { overflow: hidden; } #body_wrap { overflow-y: auto;
body { margin: 0px; border: 1px solid black; } #head { text-align: center; background: linea
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
我试图了解此 CSS 规则将应用于哪些元素: body h1, body .h1 { font-family: 'Open Sans', sans-serif !important;
此问题与使用 Jade templates 有关与 Express.js . 我知道当我写 layout.jade其中包含: !!! html body != body hea
我正在尝试为 body 设置不透明度。但是,我遇到了一个问题。 在body 上设置不透明度时,只有它的内容会受到影响。 背景不受不透明度的影响。 $("button").click(function(
我的游戏中有两个对象:球和星星 球是静态或动态的物体。 对于明星: 我需要知道星星何时与球相撞 但它需要穿过小球并且不受碰撞影响 我应该怎么做? 谢谢 袜套 最佳答案 您想使用 Sensors (6.
我以前问过这个问题,但所有答案都不起作用,所以我有一个示例页面,webpage .我有一个重新调整大小的菜单,我想在菜单外单击时关闭菜单,以及在第一次切换下拉菜单时让主体向下动画,这样下拉菜单就不会隐
我有一个漂浮在我其余内容上的井。我遇到的问题是,当它加载页面时,它会下推其余内容。我该如何更改它以便它悬停在所有内容上并且不会在页面加载时将内容下推。 这是页面加载的图像。 这是向下滚动页面的图片 请
在我的代码中我有这个: #body { background-color: #efeeef; clear: both; padding-bottom: 35px; } 还有这个
我想做以下事情。 $("a").click(function (event) { event.preventDefault(); $.get($(this).attr("href"),
在documentation在其他地方,我看到使用了 Body 但不知道它是什么。 谁能解释一下这三个选项是什么意思? from fastapi import Body from pydantic i
我试图在 body 加载后触发一个功能。我知道你可以从 body 标签中做到这一点,但如果可能的话,我更愿意从 JS 中做到这一点。 例如:document.getElementsByTagName(
在 Pymunk 中,当我旋转一个物体时,它的形状并没有旋转。当我施加一个冲动时,形状会如预期的那样同步移动。我的谷歌搜索表明 body 的形状应该在 body 旋转时旋转。我是否从根本上误解了旋转?
在我的移动网站/应用程序中使用 jQueryMobile 时,我刚刚开始遇到非常奇怪错误 编辑 我正在添加图片,可能更容易理解问题 edit2 我发现了这个问题。仍然好奇为什么会这样 如果您想查看原
我正在使用 Phaser.js 及其 p2 物理来模拟“流体”。你可以在this中看到创建一种流体体的示例(归功于 John Watson)。唯一可能的交互是鼠标移动。 我注意到一些有趣的特性可能有助
我认为是后一项, :not(body> element) 说明 body 标签中的所有“元素”元素。这是否与 同义 body >:not(element) ?? 最佳答案 body >:not(ele
我是一名优秀的程序员,十分优秀!