百分请教,类型转换问题

flyingbug 2006-11-10 04:08:58
C++的这种风格的代码是什么意思?是指针的强制类型转换吗?
有什么好处?会不会有什么风险?

Subscription *subscription = (Subscription *) event->data_;

其中
event的data_成员是一个char data_[MAX_PAYLOAD_SIZE];
Subscription 是一个类,定义如下:(也没见到用户定义的类型转换)
class Subscription
{
// = TITLE
// Allows Consumers to subscribe to be routed information
// arriving from a particular Supplier connection id.
public:
void decode (void)
{
this->connection_id_ = ntohl (this->connection_id_);

for (ACE_INT32 i = 0; i < this->total_consumers_; i++)
this->consumers_[i] = ntohl (this->consumers_[i]);

this->total_consumers_ = ntohl (this->total_consumers_);
}
// Decode from network byte order to host byte order.

void encode (void)
{
this->connection_id_ = htonl (this->connection_id_);

for (ACE_INT32 i = 0; i < this->total_consumers_; i++)
this->consumers_[i] = htonl (this->consumers_[i]);

this->total_consumers_ = htonl (this->total_consumers_);
}
// Encode from host byte order to network byte order.

ACE_INT32 connection_id_;
// Connection id.

ACE_INT32 consumers_[MAX_CONSUMERS];
// Connection ids for consumers that will be routed information
// containing this <connection_id_>

ACE_INT32 total_consumers_;
// Total number of these consumers.
};
...全文
576 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2006-11-10
  • 打赏
  • 举报
回复
万事万物都是有联系
数组数据也可以强转为结构体类型提取数据
那数组也和其有关了?

我的意思是没有必然的联系,恰巧因为用到一块而已

只要理解socket传送结构数据都是按照字节传递同样不改变对象内存结构原样传递
类型转化只是改变数据提取方式
这样就行了 还有什么不理解
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
to:wenstory
确实是ACE,在java和.NET中,对于这种网络传输对象的序列化问题,基本上都是自己动手来转换成字符数组的
而C++的这种基于指针的转换我就不太了解了
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
to:goodluckyxl
因为socket传输过来的字符串用了指针转换来从字符串转换成对象

而指针强制类型转换又涉及到了内存分布的问题

所以这个是关联在一起的问题吧
wenstory 2006-11-10
  • 打赏
  • 举报
回复
是强制转换
将数据填到event->data_中然后强制转换为Subscription类指针
在网络编程传数据时经常这样做
好像楼主玩的是ACE
我看过一段时间
实在晕就不看了
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
to:goodluckyxl
这个....不乱吧
goodluckyxl 2006-11-10
  • 打赏
  • 举报
回复
分布是分布,socket是socket两马事
我看楼主现在处于混乱中

...
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
刚才看了c的内存布局和内存对齐问题,据那上面的说法,c标准并没有规定struct在内存中是否是连续分布的,但是规定了声明顺序等同于内存中的顺序,不同的平台上对齐的标准也不一样

那么,我们用socket传送对象或结构的时候,将一个对象转换成字符流,究竟改遵循什么原则呢?把各个成员按照声明顺序转成char数组然后拼在一起?
goodluckyxl 2006-11-10
  • 打赏
  • 举报
回复
那么第一个成员比如占4个bit,那么是不是从第5个bit就是第二个成员了?
内存分布是按照成员声明的顺序来分布的吗?

//一般来说是这样,声明顺序即为内存分布顺序
taodm 2006-11-10
  • 打赏
  • 举报
回复
哎,你需要看C语言大全,看结构的内存布局问题。

内存分布是按照成员声明的顺序加对齐所需要的内存填充字节来分布的。
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
to:taodm(taodm)

客户端应该是从Subscription转成char数组吧?
怎么也是从char数组强制转换一个Subscription出来?那客户端这个char数组是哪来的啊?
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
抱歉,帖子已经不能该名了

我就是不明白强制类型转换锁带来的转换的问题啊,转换总的有规则吧

你说的第一个成员为起始内存地址就是我要的答案的一部分

那么第一个成员比如占4个bit,那么是不是从第5个bit就是第二个成员了?
内存分布是按照成员声明的顺序来分布的吗?
突击召唤师 2006-11-10
  • 打赏
  • 举报
回复
内存对齐和字节序问题
taodm 2006-11-10
  • 打赏
  • 举报
回复
如果我要构造一个char来表示我帖子里问道的Subscription类型,我该怎么构造这个char?

客户端:
Subscription * p = (Subscription *)event->data_;
p->connection_id_ = 10;

server端
Subscription * p = (Subscription *)event->data_;
cout << p->connection_id_;
就会打印出10
goodluckyxl 2006-11-10
  • 打赏
  • 举报
回复
你把问题整理一下说清楚
内存分布是内存分布
强制类型转化是强制类型转化
强转是不会改变内存分布

struct class 在c++中没有本质区别都是声明类型
一般类对象都以第一个成员做为起始内存地址
flyingbug 2006-11-10
  • 打赏
  • 举报
回复

或者这么说吧,如果我要构造一个char来表示我帖子里问道的Subscription类型,我该怎么构造这个char?
比如我是一个client,发送一个消息到server,而server将用指针类型转换方法把它解析成Subscription类,那么我这个消息改如何构造?
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
我看了C++ primer的强制类型转换了,没说到这个问题啊
那就说struct或者class吧,我们来举例说明

比如,我定义了一个
struct Subscription
{
mothed1();
mothed2();
int field1;
int field2;
};
一个
class student
{
string name;
int id;
}

是不是这样?
Subscription在内存中的数据序列就是这样排列的:
一个指向方法mothed1的指针,一个指向方法mothed2的指针,一个int型(表示field1),一个int型(表示field2)?

student类在内存里就是一个string类型跟着一个int类型?
taodm 2006-11-10
  • 打赏
  • 举报
回复
Subscription存在内存中的数据是什么样子的是谁规定的?
是作为程序员的你规定的!
你写下了struct Subscription{.....};就规定了它在内存里的样子。
taodm 2006-11-10
  • 打赏
  • 举报
回复
呃,楼主,你还是找本C语言大全或者C++ Primer,看强制类型转换吧。
你缺的基础知识太多了点。
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
to:taodm
嗯..是我理解错了,但是还是不明白内存里的数据怎么转换成Subscription对象的,或者说,Subscription存在内存中的数据是什么样子的是谁规定的?我总的知道才能构造这个data_
flyingbug 2006-11-10
  • 打赏
  • 举报
回复
to:ddong

那么当我要操作这个对象的时候,这个地址开始的内存是怎么转换成Subscription对象的呢?总的有点规范吧,要不然不是会乱套?
加载更多回复(8)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧