|
|
|
|
 关于用“=”进行数据结构赋值的问题 - ATHEROS [ 2006-02-22 09:53 | 411 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - ddd [ 2006-02-24 13:28 | 152 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - longwen [ 2006-02-24 11:03 | 541 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - Atu [ 2006-02-24 11:58 | 542 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - longwen [ 2006-02-24 12:06 | 211 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - teawater [ 2006-02-24 11:07 | 61 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - longwen [ 2006-02-24 11:20 | 46 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - teawater [ 2006-02-24 11:27 | 49 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - Atu [ 2006-02-22 11:05 | 194 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - albcamus [ 2006-02-23 13:59 | 148 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - Atu [ 2006-02-23 14:11 | 1,963 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - albcamus [ 2006-02-23 16:23 | 56 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - tyc611 [ 2006-02-24 09:17 | 23 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - lonelyflyer [ 2006-02-24 09:29 | 95 byte(s)]
 Re: 关于用“=”进行数据结构赋值的问题 - wealsome [ 2006-02-24 10:23 | 50 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
struct X {
int x1;
int x2;
};
int main(void) {
struct X a, b;
a.x1 = 1;
a.x2 = 2;
b = a;
....
}
在上述代码中,用反汇编观察,“b=a”完成了
一次内存复制。我的问题是:它和使用
memcpy的区别在哪里,孰优孰劣?
谢谢!
|
|
|
----
以上均代表了个人观点
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
memcpy的效率一定不低于b = a;
b = a一定比memcpy更安全。
除非确认结构成员都是POD(Plain Old Data),否则不要用memcpy
除非效率非常重要,否则建议用b = a
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
>除非确认结构成员都是POD(Plain Old Data),否则不要用memcpy
您能讲一讲这句话的具体含义吗? (何种类型的成员会由于memcpy造成意外)谢谢
|
|
----
屠龙有技无人赏。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
http://www.royaloo.com/articles/articles_2003/cme01.htm
以下文字是从上面网页摘抄的:
什么时候可以安全地使用memcpy?
最后一个例子来自于最近同事提出的一个问题:什么时候可以安全地使用memcpy将一个数组中的元素拷贝到另一个数组中?例如,早先我们提倡将:
int i = 0;
while (i < n)
{
y[i] = x[i];
++i;
}
改写为:
std::copy(x, x + n, y);
难道我们不能将其改写为如下所示吗?
memcpy(y, x, n * sizeof(x[0]))
这当然可以,这样可以使我们的程序跑得更快。
和前面三个问题一样,这个问题也有一个答案:只有当数组x与数组y中的元素的类型都是所谓的POD时,语言定义才能保证本例中的memcpy正确运行。术语POD表示“"plain old data”。不太严格地说,一个POD类型中不存在用户定义的拷贝构造函数、赋值运算符或者析构函数,这样,构成其内部表示的那些位(bits)就完全定义了POD的值。可以想象memcpy也同样适用于其他类型。例如,只要程序员努力避免重复析构和内存泄漏,在许多编译器上memcpy也可以完美地拷贝string和vector这样的对象。例如:
string s, t;
// Swap the contents of s and t
// This code works only by accident
char x[sizeof(s)];
memcpy(x, (char*) &s, sizeof(s));
memcpy((char*) &s, (char*) &t, sizeof(s));
memcpy((char*) &t, x, sizeof(s));
这个程序片断用于交换构成s与t的内部表示的位(bits),它可以在许多编译器上正确地工作,因为我们能够想到的大多数string类的实现都并不关心string对象自身的存储位置。然而,语言标准并没有要求所有编译器都应该保证这个例子可以工作,因为string并不是POD类型。我们可以使用下面的方式更为安全地交换s和t的值:
std::swap(s, t);
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
C++ 里面的结构赋值是怎么实现的呢?为什么会更安全?
|
|
----
What are u waiting for? Spread your wing and soar
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
我说一句话,正确与否请大家自己鉴别:
我只是模糊的记得,不是太详细.
结构体的赋值在编译是会分成2种情况,一种是成员的分别赋值,就是A.X=B.X;A.Y=B.Y
第二种就是如果结构体复杂或者比较大时使用内存拷贝,可以自己查看反汇编代码.
而关于MEMCPY()它其实的实现在__MEMCPY__(),里面就是汇编实现的.代码自己看一下吧
我印象中结构体复杂或者比较大时使用内存拷贝的代码和__MEMCPY__()汇编实现没有太大差别啊,何来哪个安全之分?
大半年没有注意这些东西了,是否正确还请回复一下
|
|
|
----
学生一个
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
> 我说一句话,正确与否请大家自己鉴别:
如果结构体中的成员,都是纯数据(POD类型,详细描述到网上找找),
那么编译器可能会考虑使用内存复制的方式,但这应该是一种优化措施吧,应该是不强制的。
g++中就是这么实现的。
如果结构体的成员是具有构造函数,或赋值构造函数,或者有虚函数,或者....,总之,不是纯数据类型,
那么编译器将会依次按成员赋值,它的效率肯定比内存复制低,但是它是正确的做法。
对于后者情况,如果程序中使用了memcpy,那么很可能是灾难性的后果。
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
哦,你说的是C++的啊,我说的是C的情况,C++没有考虑,另外茶兄是说法也正确,我没有__MEMCPY__()的代码,不过我认为,检查边界和越界问题应该是程序员的职责!系统实现考虑的应是高效的实现.
不知是否为诡辩?
|
|
|
----
徘徊在人生的十字路口!望请指点迷津!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
结构赋值在c下是不是memcpy没有硬性规定吧
在c++下到底=怎么回事,不知道答案的查查c++98手册,就有权威答案了。
反正没说和memcpy一定有关系。
|
|
----
I solemnly swear that I am up to no good
|
|
[Original]
[Print]
[Top]
|
|
|