读书人

1个难题,该如何处理

发布时间: 2012-03-17 19:06:28 作者: rapoo

1个难题
struct A
{
bool a;
......
}
如果a,则A以8对齐(#pragma pack(8)),否则2对齐,
请问,如何实现?
最好是运行时的,因为我直到运行时刻才知道a的值,并且对于结构的使用者,只想知道存在这么一个结构A

[解决办法]
en`~~~

union能实现这个功能么?
[解决办法]
貌似不行吧,还没有分配空间的时候肯定还不知道a的值,分配好空间了,对齐也就不能动态了
能不能用一个额外的宏来控制
[解决办法]
运行时,C语言的代码已经变成2进制指令了,对A的域的访问已经由编译器生成代码时固定了。怎么动态啊!除非定义:
struct A1 // 按2字节对齐
{
bool a;
...
};
struct A2 // 按8字节对齐
{
bool a;
...
};
运行时在按照a的值,做强制类型转换。 -.-!


[解决办法]
以8对齐
和#pragma pack(8)
在你需要中应该是不同的吧

因为#pragma pack(8)是对编译器来讲的,是编译期的事情,而你要的是运行期的
[解决办法]
说说哦你的原始需求。
[解决办法]
class typetrue
{
};
class typefalse
{
};
#pragma pack(8)
class A <typetrue>
{
....
}
#pragma pack(2)
class A <typefalse>
{
....
}
[解决办法]
没什么办法,除非定义成俩个几乎一样的结构,一个用#pragma pack(8) 另一个用#pragma pack(2),这样可能可以,再用BOOL决定选择哪个结构,不过好像也不能实现....

烦....
[解决办法]
都已二字节对齐
a结构中填充7各字节就可以了
[解决办法]
除非你不用结构,用其他东西....刚才跑去问老大,他说没办法。....
[解决办法]
为什么有这种需求呀,如果想通讯的话,直接约定好就好了呀,而且一般约定就是跟1对齐啊

何必这么麻烦
[解决办法]
只有将调用程序的对齐设置与被调用库设为一致,对对齐设置的库函数的操作进行封装,将不同设置的结构体分解后按统一的设置重组,将所有不同设置的结构体统一到一种对齐设置。
[解决办法]
对其原则是在编译器决定的。只能通过编译器指令进行,比如:

#ifdef PACK8
#pragma pack(8)
#else
#pragma pack(2)
#endif
[解决办法]
你为什么要用2个同名结构?
另外,继承就是让你做这事的。
[解决办法]
我觉得其实只要把这个结构体拆成2个部分存放就好了。
bool a;
struct A{......};

例如:数据存放在字节数组 char x[n];中,可以这样写吧。
struct A *p;
if( x[0] )p=(struct A*)(a+8);
else p = (struct A*)(a+2);



[解决办法]
你对于8字节对齐的情况,还是自己补位来完成吧
[解决办法]
对于两种对其方式,其实本质上是两种不同的结构,虽然看起来基本一样。
建议定义两个不同的结构比如
class A8 {...
class A2 {...
然后根据需要选择不同的代码分支,你期望的那种方法是不太可行的。
[解决办法]
UPJF
学习
[解决办法]
呵呵,忽然想到,是否可以做成dll,分别用两种对齐方式编译,然后运行的时候,根据版本号的不同,动态加载不同的dll呢? :)
[解决办法]
对齐是什么意思?
[解决办法]
一个代码中是不可能做到的,因为一个是编译时确定,一个是运行时确定。


[解决办法]
LZ是遇到这样的一个问题吧:
bool a不同,表示版本号不同,版本号不同,数据结构不一样。这样的话访问相同的数据,就必须用不同的语句来访问,这样就会有很多分支,写起来很麻烦。其实你可以用一个类封装这个结构体,用成员函数去访问数据,下面就可以写相同的语句去访问了,不会出现很多分支,比如:
#pragma pack(8)
struct A1
{
....
char *data;
};
#pragma pack(2)
struct A2
{
....
char *data;
};

class A
{
public:
bool a;
union AA
{
A1 m_a1;
A2 m_a2;
} m_a;
char *GetData()
{
return a?m_a.m_a1.data:m_a.m_a2.data;
}
};

使用的时候
A a;
不管是哪种,访问data这个数据。都可以a.GetData()来访问,省却了不少劳力

读书人网 >C++

热点推荐