std::shared_ptr 到数组的数组索引符号
array index notation with std::shared_ptr to an array
我正在编写一些通过内部函数使用 SSE/AVX 的代码。因此,我需要保证对齐的数组。我正在尝试使用以下代码通过 _aligned_malloc 制作这些:
template<class T>
std::shared_ptr<T> allocate_aligned( int arrayLength, int alignment )
{
return std::shared_ptr<T>( (T*) _aligned_malloc( sizeof(T) * arrayLength, alignment ), [] (void* data) { _aligned_free( data ); } );
}
我的问题是,如何使用通常的数组索引符号来引用数组中的数据?我知道 unique_ptr 对调用 delete[] 进行销毁的数组有专门化,并允许使用数组索引符号(即 myArray[10]
访问数组的第 11 个元素)。但是我需要使用 shared_ptr。
这段代码给我带来了问题:
void testFunction( std::shared_ptr<float[]>& input )
{
float testVar = input[5]; // The array has more than 6 elements, this should work
}
编译器输出:
error C2676: binary '[' : 'std::shared_ptr<_Ty>' does not define this operator or a conversion to a type acceptable to the predefined operator
1> with
1> [
1> _Ty=float []
1> ]
有办法吗?我对使用智能指针还是很陌生,所以我可能搞砸了一些简单的事情。感谢您的帮助!
您正是想要的东西在 C++ 中实际上是不可能的。
原因很简单:shared_ptr
没有为他们实现operator[]
,operator[]
必须作为成员实现。
但是,您可以通过以下三个选项之一获得非常接近的效果:
只需使用具有正确对齐方式的成员类型的 vector
(例如 xmmintrin.h
中的 __m128
)并放弃所有其他工作。
自己实现一个类似于shared_ptr
的class(可能在幕后使用std::shared_ptr
)
在需要时提取原始指针 (float testVar = input.get()[5];
) 并对其进行索引。
对于面临类似问题的人,以下内容可能会有所帮助。不要使用指向数组的共享指针,而是使用指向指针的共享指针。您仍然可以使用索引表示法,但您需要在此之前取消引用共享指针:
std::shared_ptr<int*> a = std::make_shared<int*>(new int[10]);
(*a)[0] = 5;
std::cout << (*a)[0] << std::endl;
我正在编写一些通过内部函数使用 SSE/AVX 的代码。因此,我需要保证对齐的数组。我正在尝试使用以下代码通过 _aligned_malloc 制作这些:
template<class T>
std::shared_ptr<T> allocate_aligned( int arrayLength, int alignment )
{
return std::shared_ptr<T>( (T*) _aligned_malloc( sizeof(T) * arrayLength, alignment ), [] (void* data) { _aligned_free( data ); } );
}
我的问题是,如何使用通常的数组索引符号来引用数组中的数据?我知道 unique_ptr 对调用 delete[] 进行销毁的数组有专门化,并允许使用数组索引符号(即 myArray[10]
访问数组的第 11 个元素)。但是我需要使用 shared_ptr。
这段代码给我带来了问题:
void testFunction( std::shared_ptr<float[]>& input )
{
float testVar = input[5]; // The array has more than 6 elements, this should work
}
编译器输出:
error C2676: binary '[' : 'std::shared_ptr<_Ty>' does not define this operator or a conversion to a type acceptable to the predefined operator
1> with
1> [
1> _Ty=float []
1> ]
有办法吗?我对使用智能指针还是很陌生,所以我可能搞砸了一些简单的事情。感谢您的帮助!
您正是想要的东西在 C++ 中实际上是不可能的。
原因很简单:shared_ptr
没有为他们实现operator[]
,operator[]
必须作为成员实现。
但是,您可以通过以下三个选项之一获得非常接近的效果:
只需使用具有正确对齐方式的成员类型的
vector
(例如xmmintrin.h
中的__m128
)并放弃所有其他工作。自己实现一个类似于
shared_ptr
的class(可能在幕后使用std::shared_ptr
)在需要时提取原始指针 (
float testVar = input.get()[5];
) 并对其进行索引。
对于面临类似问题的人,以下内容可能会有所帮助。不要使用指向数组的共享指针,而是使用指向指针的共享指针。您仍然可以使用索引表示法,但您需要在此之前取消引用共享指针:
std::shared_ptr<int*> a = std::make_shared<int*>(new int[10]);
(*a)[0] = 5;
std::cout << (*a)[0] << std::endl;