【发布时间】:2017-02-10 16:33:39
【问题描述】:
我正在寻找一种在编译器对齐之前获取结构/类的原始大小的方法(更清楚地说是结构/类的成员字段的总和),如下所示:
struct Foo{
char c;
// the compiler will appen 3 bytes here
int i;
};
sizeof(Foo) 返回 8 但原始大小为 5。
假设我们要编写一个模板函数或名为 orig_sizeof() 的宏
template <class t>
size_t orig_sizeof(t)
{
// calculate the sum of the fields of t
}
当然sizeof是一个内部宏,一个没有源代码的关键字宏。
一种可能的方法是使用 __attribute__ 或 #pragma 更改结构对齐,而不是使用 sizeof 获取大小,然后将对齐恢复为默认值(也许 c++11 的 decltype 可能有用!),任何关于有用实现的想法?
编辑: 我试图通过比较 sizeof(type) 和 orig_sizeof(type) 来编写一个不接受作为参数的优化库,如果可能的话,要求用户重新对齐字段以获得更好的性能
【问题讨论】:
-
不,不可能。
-
1) 不要发送垃圾标签。 C 不是 C++ 不是 C。 2) 为什么你认为对象的大小会随着对齐而变化? 3) 如果
sizeof(Foo) == 8,则Foo的大小为8。 -
没有“原始尺寸”之类的东西。你只是对 C++ 类型系统有一个错误的形象。
-
确实如此,编译器会在结构中附加额外的字节,您可以自己尝试一下,比较
sizeof ( struct { char c;char c1;int x; }; )和sizeof ( struct {char c; int x;char c1; }; )它们分别是8和12 -
@DhiaHassen 编译器优化内存。你问的目的是什么?我很难理解。
标签: c++ struct alignment sizeof