社区
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 默认的初始化函数内部是怎样实现的?
...全文
414
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)
{
}
};
具体想知道怎么做的,就看汇编代码了
202006-2 稀疏向量(100分)
本文分享了在解决特定
问题
时,如何通过不同数据结构和算法优化
C++
代码的
执行
效率
,从最初的map到vector,再到自定义
结构体
与数组,最终达到90分的评分。探讨了map.find()函数的性能瓶颈,以及如何通过排序和双指针技巧提升vector的处理速度。
位域 内存 字节序_C/
C++
编程笔记:C语言对齐
问题
【
结构体
、栈内存以及位域对齐】...
本文深入探讨了C/
C++
编程中的字节对齐
问题
,包括什么是字节对齐、对齐的原因和作用、对齐的分类和准则,以及
结构体
对齐、栈内存对齐和位域对齐的详细分析。通过对字节对齐的理解,可以帮助开发者优化内存使用和提高程序
执行
效率
。同时,文章也提醒了对齐
问题
在不同处理器和编译器中可能带来的隐患,提供了解决这些
问题
的策略和方法。
C/
C++
利用restrict优化二进制协议解析
文章展示了一个
C++
程序,用于测试解析包含四个无符号整数的
结构体
的
效率
。通过一个名为`parse`的函数,从数据缓冲区中提取值到
结构体
中。然后在`test`函数中使用一个大循环进行多次解析操作,并使用内联汇编来处理内存和性能
问题
。程序最后计算并比较了两次
执行
的时间差异。
[收藏转贴]struct探索·extern "C"含义探索 ·
C++
与C的混合编程·C 语言高效编程的几招...
本文深入探讨了C/
C++
语言的
结构体
特性及其指定对齐方式,揭示了
C++
中externC的双重含义与在
C++
与C及其它语言间的混合编程中的应用。同时,提供了C语言高效编程的四招技巧,包括以空间换时间、数学方法解决
问题
、使用位操作与汇编嵌入,以提升程序
执行
效率
。
c/
c++
中#include <>与#include""区别
本文详解如何利用.NET 8的Native AOT技术将C#类库编译为无托管依赖的原生DLL,实现与
C++
项目的高效互操作。涵盖核心原理、项目配置(如PublishTrimmed、TieredPGO)、导出函数规范(static + UnmanagedCallersOnly)、字符串/
结构体
跨语言传递机制,以及针对x86支持、反射裁剪和调试等典型
问题
的解决方案,并提供性能实测数据验证其接近原生
C++
的
执行
效率
。
C++ 语言
65,210
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章