gpt4 book ai didi

c++ - 将 T 数组别名为 std::complex 数组合法吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:53 26 4
gpt4 key购买 nike

我知道强类型别名规则。然而,cppreference注意到

An implementation cannot declare additional non-static data members that would occupy storage disjoint from the real and imaginary components and must ensure that the class template specialization does not contain any padding. The implementation must also ensure that optimizations to array access account for the possibility that a pointer to value_type may be aliasing a std::complex specialization or array thereof.

这个要求是否允许像下面这样的代码是合法的,即使它不一定是道德的?

std::size_t numDoubles = 100;
double* a = (double*) std::malloc(numDoubles * sizeof(double));
std::complex<double>* b = reinterpret_cast<std::complex<double>*>(a);
DoSomethingWith(b[1]);

如果使用 new[] 生成 double 组,答案会改变吗?

XY 问题说明:我正在尝试对可能不存在的第三方库提供的分配器进行抽象;该分配器返回一个 void*;我试图避免将库是否存在的细节泄漏到 header 中。所以我有如下结构:

// foo.h
namespace impl {
void* Allocate(std::size_t numBytes);
}

template<typename T>
T* Allocate(std::size_t num) {
static_assert(std::is_pod_v<T>);
return static_cast<T*>(Allocate(num * sizeof(T)));
}


// foo.cpp
#if LIBRARY_PRESENT

void* impl::Allocate(std::size_t numBytes) { return LibraryAllocate(numBytes); }

#else

void* impl::Allocate(std::size_t numBytes) { return std::malloc(numBytes); }

#endif

不幸的是,std::complex 不是 POD,因为它有一个非平凡的默认构造函数。我希望我可以忽略这个问题。

最佳答案

Does this requirement allow code like the following to be legal

即使您使用 a,该代码也不是严格合法的直接而不是对 complex 进行转换. C++ 对象模型不允许您只获取一些内存,将其转换为一个类型,然后假装对象存在于该内存中。无论类型如何(字节类型之外)都是如此。

该代码永远不会创建 double 的数组,因此您不能像访问 double 的数组一样访问内存在那里。您也无法访问 complex<double>就好像它在那里一样。

Does the answer change if new[] is used to generate the array-of-double?

仅在存在合法数组 double 的意义上.仍然没有 complex<double>那里。

std::complex<T> 的规则提供的是 you can access its members as though it were an array of two T s .这意味着您可以访问任何两个 T 的数组就好像它是一个 std::complex<T> .

关于c++ - 将 T 数组别名为 std::complex<T> 数组合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52867194/

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