我将应用程序从32位移植到64位。
它是C风格的编码(遗留产品),虽然它是C++。我有一个问题,即使用联合和结构的组合来存储值。这里使用了一个名为“Any”的自定义数据类型,它应该保存任何基本数据类型的数据。 Any的实现如下:指针转换为64位环境中的长移植问题
typedef struct typedvalue
{
long data; // to hold all other types of 4 bytes or less
short id; // this tells what type "data" is holding
short sign; // this differentiates the double value from the rest
}typedvalue;
typedef union Any
{
double any_any;
double any_double; // to hold double value
typedvalue any_typedvalue;
}Any;
该联合的大小为8个字节。他们使用了union,所以在给定的时间只有一个值,他们使用struct来区分类型。您可以在任何给定时间存储double,long,string,char,float和int值。那是这个想法。 如果它是一个double值,则该值存储在any_double中。如果它的任何其他类型,则它存储在“数据”中,并且该值的类型存储在“ID”中。 “符号”会告诉如果值“任何”持有双重或其他类型。 any_any在代码中用于宽泛地复制地址空间中的值,而不考虑类型。 (这是我们最大的问题,因为我们不知道在给定的时间它会保持什么!)
如果它的一个字符串或指针“任何”是假设保存,它存储在“数据”(这是键入long)。在64位,这是问题所在。指针是8个字节。所以我们需要将“long”改为等效的8个字节(long long)。但是那样会将联合的大小增加到16个字节,“any_any”的自由使用会导致问题。 “any_any”的用法太多,你永远不知道它可以容纳什么。
我已经尝试了这些步骤,结果不成功:
1.在结构中将“长数据”更改为“长长数据”,这将使联合的大小为16个字节。 - 这将不允许数据作为“any_any”(8字节)传递。
2.将结构声明为联合内的指针。并将struct中的“long data”更改为“long long data”。 - 这里遇到的问题是,因为它的指针我们需要为结构分配内存。自由使用“any_any”使我们难以分配内存。有时我们可能会覆盖内存,从而抹去价值。
3.创建一个单独的集合,该集合将保存“数据”(键值对)的值。 - 这是行不通的,因为这个实现是应用程序的核心,集合会运行到数百万的数据。
有人可以帮我吗?
所以你有一个64位平台,其中'sizeof(long)!= 8'? – Alnitak 2011-06-15 09:00:52
@Alnitak nope,这是在窗口和sizeof(长)= 4。我需要改变这很长的ñ这就是我的问题在于 – Reji 2011-06-15 09:28:58