Altivec——常量变量的负载
Altivec -- load of const variable
使用altivec从const指针加载的最佳方式是什么?
根据文档(以及我的结果),vec_ld不将const指针作为参数:http://www-01.ibm.com/support/knowledgecenter/SS2LWA_12.1.0/com.ibm.xlcpp121.bg.doc/compiler_ref/vec_ld.html
因此,像这样的东西将失败:
void foo(const float* A){
vector4double a = vec_ld(0,A);
...
}
一个令人讨厌的解决方案是:
void foo(const float* A){
vector4double a = vec_ld(0,const_cast<float*>A);
...
}
有更好的方法吗?非常感谢。
使用const_cast
。
它的存在正是为了这个目的:处理常量不正确的API。
typedef __vector uint8_t v128_u8;
typedef __vector float v128_f32;
inline v128_f32 Load(const float * p)
{
v128_u8 lo = vec_ld(0, p);
v128_u8 hi = vec_ld(A, p);
return (v128_f32)vec_perm(lo, hi, vec_lvsl(0, p));
}
如果您有Power7或Power8 CPU,则使用函数vec_vsx_ld。
您的const float *
意味着您指向不可修改的内容,但您仍然可以指向其他内容。
我不知道你的函数vec_ld
,但我想因为它需要一个指向浮点的指针,所以函数会改变所指向的值。
然后,您必须提供一个可修改的值。
我不会使用你讨厌的变通方法,因为调用你的方法的用户不会期望它的浮点值被修改,而且肯定会因为将来会出现讨厌的错误。
如果您可以将方法foo
更改为foo(float * A)
或foo(float & A)
,那将是一种解脱。
有关const指针的更多信息,请参阅:const int*、const int*const和int const*之间的区别是什么?
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- Altivec——常量变量的负载