【发布时间】:2016-04-08 10:07:52
【问题描述】:
我编写了一些伪代码来解释我在实际应用程序中发现的问题(Arduino 1.6 - https://github.com/maciejmiklas/LEDDisplay):
Display.h:
class Display {
public:
void testRef();
void testVal();
private:
typedef struct {
uint8_t xOnFirstKit;
uint8_t yOnFirstKit;
uint8_t xRelKit;
uint8_t yRelKit;
uint8_t xRelKitSize;
uint8_t yRelKitSize;
uint8_t xDataBytes;
uint8_t xKit;
uint8_t yKit;
uint8_t xOnKit;
uint8_t yOnKit;
uint8_t xOnKitSize;
uint8_t yOnKitSize;
uint8_t xOnScreenIdx;
uint8_t yOnScreenIdx;
uint8_t yDataIdx;
} KitData;
inline void paintOnKitRef(KitData *kd);
inline void paintOnKitVal(KitData kd);
}
Display.cpp:
#include "Display.h"
void Display::testRef(){
KitData *kd = ....
for(int i = 0 ; i < 5000 ; i++){
paintOnKitRef(kd);
....
}
}
void Display::testVal(){
KitData *kd = ....
for(int i = 0 ; i < 5000 ; i++){
paintOnKitVal(*kd);
....
}
}
inline void Display::paintOnKitRef(KitData *kd){
for(int i = 0 ; i < 100 ; i++){
kd->yDataIdx++;
kd->yOnScreenIdx++;
.....
}
}
inline void Display::paintOnKitVal(KitData kd){
for(int i = 0 ; i < 100 ; i++){
kd.yDataIdx++;
kd.yOnScreenIdx++;
.....
}
}
我有结构:KitData,它大于 16 个字节,所以我决定通过指针而不是值来传递它——它按预期工作。
我测量了执行时间,看起来按值传递 (testVal()) 比按引用传递 (testRef()) 快大约 30%。
这正常吗?
编辑:
上面的代码只是一个伪代码 - 在我的真实测试方法中:paintOnKitVal() 和 paintOnKitRef() 包含执行许多操作和其他方法的真实代码。这两种方法也做同样的事情——唯一的区别是访问kd 的方式(通过指针或点表示法)。
这是真正的测试类:https://github.com/maciejmiklas/LEDDisplay/blob/callByPoint/Display.cpp
- 执行测试方法:
paint(...)- 如第 211 行所示,这将使用指针调用 - 注释掉第 211 行并从第 212 行删除注释 - 从现在开始,测试将使用按值调用,执行时间会更短。
【问题讨论】:
-
我已经编辑了帖子 - 现在应该是正确的。
-
你不是通过引用传递它,你传递的是一个指针。
-
这段代码有很多问题。
-
我是 C++ 新手 - 有什么问题?
-
这个问题有一点语义问题:C++ 有实际的引用类型,其中 reference 会表示为
KitData&。您传递的是一个指针,即KitData*,而不是一个引用。 C 总是按值传递参数,因此 C 程序员实际上传递指针以通过“引用”传递,但是当您谈论 C++ 时,调用该引用会令人困惑。