我的问题是,我想将结构形式从32位空间移动到64位空间。
假设我在64位空间中使用相同的字段声明相同的结构,有没有办法将相应的字段从32位复制到64位结构?
让我向实际问题介绍,这与缓存内容有关,我们在ram上的大小有限,这是32位空间,所以如果我们在ram上有1G空间而且我的单个缓存对象的结构大小是1M那么我可以存储的对象数量限制为1G / 1M。因此,为了解决这个问题,我想在64位spcace中声明我的结构(这样就没有spcace crunch),并且实际上可以将对象的数量包含在无限
假设我们在32位空间中有一个结构
typedef struct x{
int a ;
int *b ;
} x_t;
现在我想在64位空间中移动这个结构,删除32位空间结构。
typedef struct x_64{
int a ;
int *b ;
} x_64_t;
所以,如果之前我的变量被访问过像x-> b或x.a那样,我怎样才能确保将相同的值传输到64位结构,而不改变整个代码的功能。
一种方法可以是在64位空间中有一个缓冲区,对于32位空间中的每个变量访问,都要64位写入/读入缓冲区。但这是一个繁琐的过程,可以有一些替代方案吗?
答案 0 :(得分:4)
如果使用兼容的数据类型,则可以在32位和64位之间复制数据。
例如,结构:
struct xyzzy {
int a;
int b;
}
如果您的int
类型在32位和64位世界中具有不同的宽度,则将不兼容。
C99提供了固定宽度类型,例如int32_t
,无论平台如何,它们的大小都相同。如果您的编译器是兼容的,那么如果它具有该大小的实际类型,则需要提供这些类型。
如果做不到这一点,您通常可以更改源代码,以便最大限度地减少这些问题,例如:
#ifdef INT_IS_64BITS
typedef int my_64bit_type;
#endif
#ifdef LONG_IS_64BITS
typedef long my_64bit_type;
#endif
my_64bit_type xyzzy;
并使用合适的定义进行编译:
gcc -DLONG_IS_64BITS myprog.c