URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 19 » 关于用“=”进行数据结构赋值的问题
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
关于用“=”进行数据结构赋值的问题
 
 
 
 
 
 
 
 
 
 
Re: 关于用“=”进行数据结构赋值的问题 - Atu [2006-02-23 14:11 | 1,963 byte(s)]
 
 
 
 
 
Subject: 关于用“=”进行数据结构赋值的问题
Author: ATHEROS    Posted: 2006-02-22 09:53    Length: 411 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]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: Atu    Posted: 2006-02-22 11:05    Length: 194 byte(s)
[Original] [Print] [Top]
memcpy的效率一定不低于b = a;
b = a一定比memcpy更安全。

除非确认结构成员都是POD(Plain Old Data),否则不要用memcpy
除非效率非常重要,否则建议用b = a
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: albcamus    Posted: 2006-02-23 13:59    Length: 148 byte(s)
[Original] [Print] [Top]
>除非确认结构成员都是POD(Plain Old Data),否则不要用memcpy
您能讲一讲这句话的具体含义吗? (何种类型的成员会由于memcpy造成意外)谢谢
----
屠龙有技无人赏。
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: Atu    Posted: 2006-02-23 14:11    Length: 1,963 byte(s)
[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]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: albcamus    Posted: 2006-02-23 16:23    Length: 56 byte(s)
[Original] [Print] [Top]
原来是说C++, 是不是在C语言中不存在这类问题? (感觉是)
----
屠龙有技无人赏。
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: tyc611    Posted: 2006-02-24 09:17    Length: 23 byte(s)
[Original] [Print] [Top]
楼上: C中不允许这样赋值
----
--------------
我是新手,请大家多多指教!
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: lonelyflyer    Posted: 2006-02-24 09:29    Length: 95 byte(s)
[Original] [Print] [Top]
自己先试试先
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: wealsome    Posted: 2006-02-24 10:23    Length: 50 byte(s)
[Original] [Print] [Top]
C++ 里面的结构赋值是怎么实现的呢?为什么会更安全?
----
What are u waiting for? Spread your wing and soar
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: longwen    Posted: 2006-02-24 11:03    Length: 541 byte(s)
[Original] [Print] [Top]
我说一句话,正确与否请大家自己鉴别:
我只是模糊的记得,不是太详细.

结构体的赋值在编译是会分成2种情况,一种是成员的分别赋值,就是A.X=B.X;A.Y=B.Y
第二种就是如果结构体复杂或者比较大时使用内存拷贝,可以自己查看反汇编代码.

而关于MEMCPY()它其实的实现在__MEMCPY__(),里面就是汇编实现的.代码自己看一下吧


我印象中结构体复杂或者比较大时使用内存拷贝的代码和__MEMCPY__()汇编实现没有太大差别啊,何来哪个安全之分?

大半年没有注意这些东西了,是否正确还请回复一下
----
学生一个
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: teawater    Posted: 2006-02-24 11:07    Length: 61 byte(s)
[Original] [Print] [Top]
memcpy长度搞错的时候就容易出问题 估计说有安全问题的是说这个吧
----
没有一种感觉比的上回家睡觉
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: longwen    Posted: 2006-02-24 11:20    Length: 46 byte(s)
[Original] [Print] [Top]
比如说?
能举个例子说明一下长度出错吗?
----
学生一个
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: teawater    Posted: 2006-02-24 11:27    Length: 49 byte(s)
[Original] [Print] [Top]
这还用举例?你把长度设的超过你dst的长度不就完了么
----
没有一种感觉比的上回家睡觉
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: Atu    Posted: 2006-02-24 11:58    Length: 542 byte(s)
[Original] [Print] [Top]
> 我说一句话,正确与否请大家自己鉴别:

如果结构体中的成员,都是纯数据(POD类型,详细描述到网上找找),
那么编译器可能会考虑使用内存复制的方式,但这应该是一种优化措施吧,应该是不强制的。
g++中就是这么实现的。

如果结构体的成员是具有构造函数,或赋值构造函数,或者有虚函数,或者....,总之,不是纯数据类型,
那么编译器将会依次按成员赋值,它的效率肯定比内存复制低,但是它是正确的做法。

对于后者情况,如果程序中使用了memcpy,那么很可能是灾难性的后果。
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: longwen    Posted: 2006-02-24 12:06    Length: 211 byte(s)
[Original] [Print] [Top]
哦,你说的是C++的啊,我说的是C的情况,C++没有考虑,另外茶兄是说法也正确,我没有__MEMCPY__()的代码,不过我认为,检查边界和越界问题应该是程序员的职责!系统实现考虑的应是高效的实现.
不知是否为诡辩?
----
徘徊在人生的十字路口!望请指点迷津!
[Original] [Print] [Top]
Subject: Re: 关于用“=”进行数据结构赋值的问题
Author: ddd    Posted: 2006-02-24 13:28    Length: 152 byte(s)
[Original] [Print] [Top]
结构赋值在c下是不是memcpy没有硬性规定吧
在c++下到底=怎么回事,不知道答案的查查c++98手册,就有权威答案了。
反正没说和memcpy一定有关系。
----
I solemnly swear that I am up to no good
[Original] [Print] [Top]
« Previous thread
检测tcp链接断开有什么方法?
C/C++编程版
19
Next thread »
请教一个汉字库的问题
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:19, cost 0.055635929107666 ms.