【发布时间】:2013-12-06 19:16:46
【问题描述】:
为了简单起见,我有一个结构类似于
typedef struct foo
{
void *data;
size_t sz;
/* various other crap */
} foo_t;
但我发现大约 90% 的时间它真的只需要存储一个字节或最多一个短字节(但有时,它需要是一大块内存)。我是否要求使用执行某种大小检查的函数来包装 get 和 set 并直接在 data 中存储和读取小数据而不是将其用作指针?逻辑看起来很简单,例如
if (f->sz <= sizeof(void*) && f->sz == sizeof(char))
{
return (char) f->data;
}
从维护的角度来看这样做的可取之处(一方面,它使释放 90% 的结构更容易,并且不会分配大量的单个字符,上帝知道堆上的位置;另一方面,它意味着现在每个读取和写入都有可能采用的多个代码路径,这意味着我将来会讨厌这个),是否有任何特殊原因我不能只存储一个字符(或指针中还有什么不大于 sizeof(void*)) 并稍后读回吗?我会在奇怪的平台上遇到字节序问题吗?我记得很久以前一位 CS 教授说“说‘指针是整数’是错误的;整数是实现指针的一种方式”,但我不知道他是否只是在提出概念性观点,或者存储是否存在真正的问题编译器被告知的位置中的非地址数据是指针。
(我的意思是,很明显,如果我随后错误地使用其中之一作为指针,那会造成痛苦,但我太聪明了,不会这样做......对吧?.. .)
【问题讨论】:
-
union { void *ptr; char byte; short sh; } data; -
很公平。但是在写入时,我不知道在编译时指针会有多大(但这解决了我 90% 问题中的 90%……我会试一试)。跨度>
-
@userXXX 嗯...什么?
-
@user3075658,你为什么不知道?那仍然只是
sizeof(data) -
答案是“你必须自己决定”。不过,我可以解决一点:“我会遇到字节序问题吗?”不,你不会。指针的存储方式无关紧要,只要您在存储和检索时进行正确的转换,它的样子并不重要。
标签: c pointers casting struct void