【发布时间】:2014-09-03 19:20:21
【问题描述】:
C99 - 特别是第 6.2.6.1 节第 4 段 - 声明允许将对象表示复制到 unsigned char 数组中:
struct {
int foo;
double bar;
} baz;
unsigned char bytes[sizeof baz];
// Do things with the baz structure.
memcpy(bytes, &baz, sizeof bytes);
// Do things with the bytes array.
我的问题:我们不能通过简单的转换来避免额外的内存分配和复制操作吗?例如:
struct {
int foo;
double bar;
} baz;
unsigned char *bytes = (void *)&baz;
// Do stuff with the baz structure.
// Do things with the bytes array.
当然,需要跟踪大小,但这首先是合法的,还是属于实现定义或未定义行为的领域?
我问是因为我正在实现类似于 qsort 的算法,并且我希望它适用于任何类型的任何数组,就像 qsort 一样。
【问题讨论】:
-
AFAIK,
char给所有东西起别名,所以应该没问题。 -
视情况而定。通常你会很好,但我知道 GCC 有一个标志,它通过假设指向不同类型的指针不能是相同的内存空间来实现更好的优化。像这样的铸造,你将无法利用它。除非/直到这是一个性能瓶颈,否则我会避免它。
-
@Dave -fstrict-aliasing?不会伤害
char。 -
反之则不好。这样就可以了。
-
@EOF 那是我想的那个。那么char就可以了吗?我找不到任何文档来检查一种或另一种方式...
标签: c void-pointers opaque-pointers