c++ 结构体执行效率的问题

Thinkingineverything 2007-11-18 10:18:49
struct A
{
int * i;
double * d;
long * l;
};

在声明实例时 想初始化这三个指针为NULL
(1)
A a=new A;
a->i=NULL;
a->d=NULL;
a->l=NULL;

(2)
A a=new A();//默认构造函数会初始指针为空

这两种效率上是否一样
我用的是Visual Studio 2005 默认的初始化函数内部是怎样实现的?
...全文
354 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
我啃 2007-11-18
  • 打赏
  • 举报
回复
编译器可能会优化,例如发现POD可以进行bit copy可能对齐后更快,积极优化有时的确很快~
healer_kx 2007-11-18
  • 打赏
  • 举报
回复
最后做得事情是一样的, 基本没有差异, 优化的力量是很大的.
ryfdizuo 2007-11-18
  • 打赏
  • 举报
回复
还是标准一点,使用class吧,并且显式的定义构造函数的行为,
而且任何事情,能自己显式操作的,千万别让编译器去做,那样会很难操控的,
当你调用默认构造函数就是将自己定义的结构,类的初始化权利交给了编译器,很不明智的啊,
当然结果也不在你的控制范围之内...^_^
zhangyanli 2007-11-18
  • 打赏
  • 举报
回复
loops分析的很不错.
iambic 2007-11-18
  • 打赏
  • 举报
回复
调用memset好了。
pigsanddogs 2007-11-18
  • 打赏
  • 举报
回复
A a=new A();//默认构造函数会初始指针为空
==========

谁跟你这么说的? 发现vs2005跟他memset了, 就以为c++会给他memset。。
loops 2007-11-18
  • 打赏
  • 举报
回复
1.

struct A
{
string abc;
int * i;
double * d;
long * l;
};

此时i,d,l为为未定义的变量。可见,加个string abc, A *a = new A()就调用默认的构造函数,不再置i,d,l为0。
如果去掉string abc的话,我看了汇编,A* a = new A();的时候也并非调用了构造函数,而是operator new之后,直接一个memset。可能成员都是POD的时候,就可以这么干,省了你人工memset的工夫。

2.
理论上说
A *a=new A;
a-> i=NULL;
a-> d=NULL;
a-> l=NULL;
要更加慢一些,因为需要先访问a得到对象的地址,再对其成员进行访问,多一次访问内存的过程。
但是因为有优化的存在,那就要看各种情况下编译器的反应了。
loops 2007-11-18
  • 打赏
  • 举报
回复
加个string abc, A *a = new A()就调用默认的构造函数,不再置i,d,l为0
可能当A的成员都是POD型的时候,A *a=new A();将memset所有的成员为0,因为汇编中也并非调用了构造函数,而是直接一个memset。
struct A
{
string abc;
int * i;
double * d;
long * l;
};
理论上说
A *a=new A;
a-> i=NULL;
a-> d=NULL;
a-> l=NULL;
要更加慢一些,因为需要先访问a得到对象的地址,再对其成员进行访问,多一次访问内存的过程。
但是因为有优化的存在,那就要看各种情况下编译器的反应了。
weiym 2007-11-18
  • 打赏
  • 举报
回复
试了下,
发现A* a = new A, 不会初始化,值是未定义的
而 A* a = new A(),会初始化为空
AlwaysSLH 2007-11-18
  • 打赏
  • 举报
回复
编译器自动生成的默认构造函数什么都不会作吧?
其形式相当于:
A()
{

}
loops 2007-11-18
  • 打赏
  • 举报
回复
不好意思,上面我错了。
loops 2007-11-18
  • 打赏
  • 举报
回复
A a=new A();//默认构造函数会初始指针为空
~~~~~~~~~~~~~~~~~~~~
会吗?此种情况下,根本就没有默认构造函数被调用。
weiym 2007-11-18
  • 打赏
  • 举报
回复
A a=new A();//默认构造函数会初始指针为空
默认构造函数是不会初始化为空的,
如果需要初始化为空,要自己定义构造函数
struct A
{
int * i;
double * d;
long * l;

A():i(NULL), d(NULL), l(NULL)
{
}
};

具体想知道怎么做的,就看汇编代码了

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧