社区
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 默认的初始化函数内部是怎样实现的?
...全文
354
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写文章
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)
{
}
};
具体想知道怎么做的,就看汇编代码了
C++
动态分配和撤销内存以及
结构体
类型作为函数参数
C++
动态分配内存(new)和撤销内存(delete) 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。
C++
提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。 注意: new和delete是运算符,不是函数,因此
执行
效率
高。 虽然为了与C语言兼容,
C++
仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。new运算符的例子: new int; //开辟一个存放整数的存储空间,返回一个指向该存储空
C++
结构体
传参
问题
C++
结构体
传参
问题
C++
的
结构体
传参可以有三种方式: 传递
结构体
变量,值传递; 传递
结构体
指针,地址传递; 传递
结构体
成员,可是值传递也可以是地址传递。 1. 传递
结构体
变量:值传递 #include<iostream> #define COMMANDLENGTH 100 using std::cout; using std::endl; // 注意C和
C++
中s...
C++
性能优化笔记-6-
C++
元素的
效率
差异-11-
结构体
和类
C++
元素的
效率
差异
结构体
和类类数据成员类成员函数(方法)虚函数运行时类型识别(RTTI)继承构造函数与析构函数
结构体
和类 时至今日,编程教材推荐面向对象编程,作为使软件更清晰及模块化的一种手段。所谓的对象是
结构体
及类的实例。面向对象编程形式对程序性能有积极与消极的影响。 积极的影响有: 一起使用的变量也保存在一起,如果它们是
结构体
或类的成员。这使得数据缓存更高效。 作为类成员的变量无需作为参数传递给类成员函数。这些变量避免了参数传递的开销。 消极影响有: 一些程序员把代码分到太多的小的类中。这是低
c/
c++
结构体
传参
问题
c/
c++
的
结构体
传参可以有三种方式: 1、传递
结构体
变量,值传递 2、传递
结构体
指针,地址传递 3、传递
结构体
成员,可是值传递也可以是地址传递 根据代码示例: 1、传递
结构体
变量 1 #include<iostream> 2 #define COMMANDLENGTH 100 3 using std::cout; 4 using std:...
C++
中
结构体
与类的区别介绍
在参与以
C++
为编程基础的项目应用中总会遇到
结构体
类型与类的数据类型,但是其具体应用区别模糊不清 现将其区别总结如下,欢迎补充共同学习(先介绍C和
C++
中
结构体
的不同,再对比
C++
中
结构体
与类的区别) 一、C和
C++
中
结构体
的不同 (1)C语言中的
结构体
不能为空,否则会报错 C语言中要求一个结构或联合至少有一个成员。C语言中,空
结构体
的大小为0,而
C++
中空
结构体
(属于空类)的大小为1 ...
C++ 语言
64,680
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章