由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - C++疑问:Animal a,Animal* a,哪种访问方式快
相关主题
借人气问个C递归函数的问题面试问了个“master c++”的这个问题,答不出来,直接给枪毙了 (转载)
问道编程题汗,不问算法
怎么才能掌握好C++里面的指针和引用?问一个关于引用和指针的问题
(C / C++) 关于指针的引用,求助G recruiter问面试语言
bloomberg 电面指针函数, 函数指针, 头大。。
用Java面试的大牛们在子函数内开内存,返回主函数指针然后释放空间是不是很糟糕的(转载)
请问一下关于new和delete的概念请教一段小程序
请教一个 c++ member function pointer 问题答面试题时候写函数, 返回类型非指针也非void的
相关话题的讨论汇总
话题: animal话题: main话题: mov话题: rax话题: foo
进入JobHunting版参与讨论
1 (共1页)
f*****7
发帖数: 92
1
如题
C++中,Animal是定义好的class
Animal a
Animal* a
a.foo()
a->foo()
用对象变量 对象指针 访问类的函数或者成员变量
哪种方式更快呢?
求大牛讲解,谢谢您的时间~~
如果有权威链接给出,那再好不过了!
d**********x
发帖数: 4083
2
。。。

【在 f*****7 的大作中提到】
: 如题
: C++中,Animal是定义好的class
: Animal a
: Animal* a
: a.foo()
: a->foo()
: 用对象变量 对象指针 访问类的函数或者成员变量
: 哪种方式更快呢?
: 求大牛讲解,谢谢您的时间~~
: 如果有权威链接给出,那再好不过了!

p*****p
发帖数: 379
3
前者造出一对象出来
后者造出一指针
你说哪个比较快?

【在 f*****7 的大作中提到】
: 如题
: C++中,Animal是定义好的class
: Animal a
: Animal* a
: a.foo()
: a->foo()
: 用对象变量 对象指针 访问类的函数或者成员变量
: 哪种方式更快呢?
: 求大牛讲解,谢谢您的时间~~
: 如果有权威链接给出,那再好不过了!

d**********x
发帖数: 4083
4
后者不再造出一对象用指针访问谁?

【在 p*****p 的大作中提到】
: 前者造出一对象出来
: 后者造出一指针
: 你说哪个比较快?

l******d
发帖数: 530
5
他愿意是问a->b和a.b孰快吧

【在 p*****p 的大作中提到】
: 前者造出一对象出来
: 后者造出一指针
: 你说哪个比较快?

f*****7
发帖数: 92
6

是这个意思,我已经update问题了,谢谢您。

【在 l******d 的大作中提到】
: 他愿意是问a->b和a.b孰快吧
p*****p
发帖数: 379
7
我查了一下
http://stackoverflow.com/questions/6919380/pointer-vs-variable-
这里有你要的答案

【在 f*****7 的大作中提到】
:
: 是这个意思,我已经update问题了,谢谢您。

g*********e
发帖数: 14401
8
指针慢一点吧?不过没啥差别吧
f*****7
发帖数: 92
9

谢谢您的帮助。
看来用指针访问,得多用一个instruction,some extra work
既然这样,那为什么要用指针呢?

【在 p*****p 的大作中提到】
: 我查了一下
: http://stackoverflow.com/questions/6919380/pointer-vs-variable-
: 这里有你要的答案

d**********x
发帖数: 4083
10
it really depends.
if foo is a virtual member function, in most of the cases the binding will
be delay to run time, and dereferencing virtual function table is often
slower.
However it is usually a small overhead... Profiling tools are better than
human to find out performance bottleneck in large systems.

【在 f*****7 的大作中提到】
: 如题
: C++中,Animal是定义好的class
: Animal a
: Animal* a
: a.foo()
: a->foo()
: 用对象变量 对象指针 访问类的函数或者成员变量
: 哪种方式更快呢?
: 求大牛讲解,谢谢您的时间~~
: 如果有权威链接给出,那再好不过了!

相关主题
用Java面试的大牛们面试问了个“master c++”的这个问题,答不出来,直接给枪毙了 (转载)
请问一下关于new和delete的概念汗,不问算法
请教一个 c++ member function pointer 问题问一个关于引用和指针的问题
进入JobHunting版参与讨论
d**********x
发帖数: 4083
11
用常规的对象通常也要取对象地址。
因为一般成员函数*事实上*需要传入this作为参数。。跑不了的

【在 f*****7 的大作中提到】
:
: 谢谢您的帮助。
: 看来用指针访问,得多用一个instruction,some extra work
: 既然这样,那为什么要用指针呢?

f*****7
发帖数: 92
12

你说得对
要考虑virtual function
用profile tools
如果就考虑一般情况呢?假设foo是个普通函数。

【在 d**********x 的大作中提到】
: it really depends.
: if foo is a virtual member function, in most of the cases the binding will
: be delay to run time, and dereferencing virtual function table is often
: slower.
: However it is usually a small overhead... Profiling tools are better than
: human to find out performance bottleneck in large systems.

d**********x
发帖数: 4083
13
我觉得没区别。
具体到底是否多出来instruction,请用gcc -S编译出来看。

【在 f*****7 的大作中提到】
:
: 你说得对
: 要考虑virtual function
: 用profile tools
: 如果就考虑一般情况呢?假设foo是个普通函数。

l*******b
发帖数: 2586
14
对象名字本身就是个指针吧? 所以没区别??
d**********x
发帖数: 4083
15
class A {
public:
void foo() {n = 0;}
private:
int n;
};
int main() {
A a;
A* p = new A;
a.foo();
p->foo();
return 0;
}
用gdb调试:
13 a.foo();
6: x/8i 0x400576
0x400576 : mov %rax,-0x18(%rbp)
=> 0x40057a : lea -0x10(%rbp),%rax
0x40057e : mov %rax,%rdi
0x400581 : callq 0x40059a
0x400586 : mov -0x18(%rbp),%rax
0x40058a : mov %rax,%rdi
0x40058d : callq 0x40059a
0x400592 : mov $0x0,%eax

【在 f*****7 的大作中提到】
:
: 你说得对
: 要考虑virtual function
: 用profile tools
: 如果就考虑一般情况呢?假设foo是个普通函数。

J**9
发帖数: 835
16
That depends on where *a is allocated?
Animal a : definitely stack
Animal* a: can point to either a stack object or a heap object.
Access to Stack is faster than to heap.

【在 f*****7 的大作中提到】
: 如题
: C++中,Animal是定义好的class
: Animal a
: Animal* a
: a.foo()
: a->foo()
: 用对象变量 对象指针 访问类的函数或者成员变量
: 哪种方式更快呢?
: 求大牛讲解,谢谢您的时间~~
: 如果有权威链接给出,那再好不过了!

t*******i
发帖数: 4960
17
长见识了,有意思

【在 p*****p 的大作中提到】
: 我查了一下
: http://stackoverflow.com/questions/6919380/pointer-vs-variable-
: 这里有你要的答案

b***m
发帖数: 5987
18
实际使用中你不用考虑其速度的差别。
s*****n
发帖数: 5488
19
变化太多了。
1.如果是so,需要查PLT,GOT,第一次回page fault, 产生I/O.所以一个libary和程序看
哪个是第一次被调用。不同的静态link总会快于dynamic link.
2. 如果是static function,则一样块。
3. 如果instance 的function,则a应该略快。
4. 如果是vtpr的则要查表,估计二者差不多了,相对于查表的代价。

【在 f*****7 的大作中提到】
: 如题
: C++中,Animal是定义好的class
: Animal a
: Animal* a
: a.foo()
: a->foo()
: 用对象变量 对象指针 访问类的函数或者成员变量
: 哪种方式更快呢?
: 求大牛讲解,谢谢您的时间~~
: 如果有权威链接给出,那再好不过了!

w****a
发帖数: 710
20
C++调用成员函数的时,需要知道对象的this指针,由这个this指针来调用它的成员函
数。在汇编级一般是把this指针存入ecx寄存器中,然后call相应的函数地址(代码段
中)。栈变量用lea存this因为要算偏移值,lea可以一次做好sub和mov的操作。堆上的
变量直接mov即可。如果要说代码大小,lea比mov占字节多。如果说效率,访问栈资源
肯定要快写。我什么时候做个测试看看。但是正如楼上大牛所说,你完全可以不用在意
这种效率。
s*****n
发帖数: 5488
21
this是作为参数传到函数中吧,用来访问object field?还是需要this 来做一次寻址?
C++调用成员函数的时,需要知道对象的this指针,由这个this指针来调用它的成员函
w****a
发帖数: 710
22
在vc中,debug版是先把this传到ecx,然后直接call。后来我看了下release版,优化
后是要push的。

【在 s*****n 的大作中提到】
: this是作为参数传到函数中吧,用来访问object field?还是需要this 来做一次寻址?
: C++调用成员函数的时,需要知道对象的this指针,由这个this指针来调用它的成员函

1 (共1页)
进入JobHunting版参与讨论
相关主题
答面试题时候写函数, 返回类型非指针也非void的bloomberg 电面
请教一个入门级的C的指针问题用Java面试的大牛们
Got an offer请问一下关于new和delete的概念
My Microsoft Phone Interview请教一个 c++ member function pointer 问题
借人气问个C递归函数的问题面试问了个“master c++”的这个问题,答不出来,直接给枪毙了 (转载)
问道编程题汗,不问算法
怎么才能掌握好C++里面的指针和引用?问一个关于引用和指针的问题
(C / C++) 关于指针的引用,求助G recruiter问面试语言
相关话题的讨论汇总
话题: animal话题: main话题: mov话题: rax话题: foo