社区
C++ 语言
帖子详情
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 默认的初始化函数内部是怎样实现的?
...全文
377
13
打赏
收藏
c++ 结构体执行效率的问题
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 默认的初始化函数内部是怎样实现的?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
{
}
};
具体想知道怎么做的,就看汇编代码了
map中字符串与
结构体
作key
效率
比较
比较两者查找
效率
,得出结论是
结构体
比字符串组合快~~~
C++
mysql查询
C++
17编写 可以自动序列化到定义的
结构体
,支持json类型
C++
mysql查询
C++
17编写 可以自动序列化到定义的
结构体
,支持json类型。代码风格良好,适合学习,也可直接使用。
c++
语言程序设计之
结构体
c++
语言程序设计之
结构体
详细讲解
结构体
对齐相关
问题
结构体
对齐是常考的考点,面试也经常出现,值得大家学习学习。
接口封装_通过填写
结构体
中的参数来补充命令
接口封装_通过填写
结构体
中的参数来补充命令
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章