标题:新手请问关于new的效率问题
只看楼主
saigi
Rank: 1
等 级:新手上路
帖 子:4
专家分:8
注 册:2013-3-10
结帖率:100%
已结贴  问题点数:5 回复次数:7 
新手请问关于new的效率问题
第一种
private static Vector3 MyPosition = new Vector3(1, 1, 1);
void Update ()
{
    Obj.transform.position = MyPosition; //变更位置
}

第二种
void Update ()
{
    Obj.transform.position = new Vector3(1, 1, 1); //变更位置
}

请问这两种写法效率有差别吗?谢谢
【备注】注释为变更位置那句1秒会执行60次
搜索更多相关主题的帖子: private void 变更 
2013-03-11 00:05
elongtown
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:138
专家分:1003
注 册:2013-2-18
得分:0 
应该有差别,第二种new60次呢
2013-03-11 16:26
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:5 
两种方法是完全不同的两种概念了。
第一种用了静态,第二种就是常规的对象写法。
单从效率来说,第一种明显好很多。
但是第一种无论你执行多少次update方法,结果都不会变袄。
第二种也是,因为参数是固定的,无论执行多少次,结果还是不会变,而且从第二次开始,每次都会多出一个Vector3对象,等待垃圾回收。
总之从实际运用来说,两种方法都写的有问题,只是做研究测试的话,第一种好
2013-03-11 18:18
saigi
Rank: 1
等 级:新手上路
帖 子:4
专家分:8
注 册:2013-3-10
得分:0 
原来如此,
所以只要是有加new的引用类型(reference type),每次new都会增加占用内存,
那如果是string呢?string也是引用类型,但是用法和int那些一样不用加new,

void Update ()
{
    Obj.text = "AAA";
}

这样每次赋予的"AAA"会被视作不同字串吗?
这部分我看了书上的说明还是不太理解。谢谢
2013-03-11 22:25
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
new就表示创建一个对象,所以每次new都会创建一个新的对象占用内存。
string确实是引用类型,因为字符串的使用是频繁的,所以C#有专用的一块内存用于存放字符串,第一次出现新的字符串是会在内存中创建的,每次赋字符串,C#都会检测那块字符串内存区域,如果找到相同的,就会直接把该字符串的地址赋给引用,不会再创建新的了。
而int型这种,是直接把值放在变量所占的那块内存里面了。
2013-03-11 23:00
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
你要记得,C#里面,字符串是常量,不可更改的
比如string str = "AAA",这表示创建了一个字符串AAA,并把AAA的地址赋给了字符串变量str
那接着重新给变量赋值,str = "BBB",这表示又创建了一个字符串BBB,并把BBB的地址赋给了变量str,而不是把AAA改变成了BBB,AAA在内存中的字符串常量区中依然存在。
那接着再创建一个字符串变量string ss = "AAA",这时候并不会再创建一个AAA字符串,而是把之前的那个AAA的地址赋给了ss而已
2013-03-11 23:06
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
那引申一下,如果string str = "AAA" + "BBB";
这样执行以后,str的值为"AAABBB";
那么在内存里面,就会同时存在三个字符串,"AAA","BBB","AAABBB"
所以字符串相加,只会创造出新的字符串
所以在使用较多个字符串相加的时候,是会创建出很多字符串,比如"1" + "2" + "3" + "4" + "5" + "6" 会得到"123456"。但内存中除了"123456"以外,那些单个的字符串也是在的。但那些单个的字符串对我们来说并没有用,我们只想要123456而已,所以这种时候应尽量使用StringBuilder类来进行字符串的连接

[ 本帖最后由 yhlvht 于 2013-3-11 23:13 编辑 ]
2013-03-11 23:12
saigi
Rank: 1
等 级:新手上路
帖 子:4
专家分:8
注 册:2013-3-10
得分:0 
了解了~原来是这样运作,
收获很大,非常感谢你
2013-03-11 23:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-400380-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.094607 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved