gpt4 book ai didi

c++ - 包含 1 个指针的结构的大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:06 25 4
gpt4 key购买 nike

假设我有以下类模板:

template<typename T>
struct Wrapper {
T* t_;
static void check() {
static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
}
};

我查看了 C99 标准和 C++03 标准,但找不到对我在 static_assert 中表达的假设的保证。我使用多个编译器选项在 Visual C++ 2008 和 2010(32 位)以及 Linux(64 位)上的 gcc 上进行了尝试,发现我的假设得到证实。

我的问题是:

  • 我的假设对于 Visual C++ 2008/2010/11 (windows) 是否合理?
  • 对于 gcc 4.* (linux)?
  • 对于编译器标志的任意组合?
  • 您是否知道这种假设不成立的任何编译器/平台?

我猜编译器可能会在结构中添加一些填充,例如用于调试目的。但是有没有真正做到这一点的编译器?

编辑:所以正如你在这里问的那样,我想要实现的是:
我有具有以下签名的成员函数:

Someclass* OtherClass::fn();

我想像这样更改签名:

Wrapper<Someclass> OtherClass::fn();

这个包装器就像一些智能指针一样,即它关心指针的生命周期,因此当它超出范围时它会释放它。由于该函数是跨 dll 边界调用的,所以我想确保返回值(现在是具体类型,而不仅仅是一个哑指针)在所有情况下(即编译器设置等)都与指针大小相同将会。计划/希望是支持调试/发布应用程序/dll 构建的所有组合。
正如您可能会问的:不,我不能使用 boost::shared_ptr<>、std::shared_ptr<>、std::unique_ptr<> 等,因为我们不想向 dll 用户公开 boost 并且我们尚不支持 C++11。

最佳答案

如果你想假设它并且你有一个编译时检查,那么继续吧。据推测,您可以从中获得一些好处。

您不能保证有关填充的任何事情,但填充通常用于对齐,以便该类型的数组使数组的每个成员(以及结构的每个成员)正确对齐。 native 指针通常已经是对齐的正确大小,因此不需要填充,但不能保证这一点。

这不是您可以用 gcc 检查的东西——它取决于目标体系结构,而不仅仅是编译器。

关于c++ - 包含 1 个指针的结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com