草庐IT

c++ - 将指向结构的指针转换为数组指针是否有效

给定一个聚合结构/类,其中每个成员变量都是相同的数据类型:structMatrixStack{Matrix4x4translation{...};Matrix4x4rotation{...};Matrix4x4projection{...};}matrixStack;将其转换为成员数组的有效性如何?例如constMatrix4x4*ptr=reinterpret_cast(&matrixStack);assert(ptr==&matrixStack.translation);assert(ptr+1==&matrixStack.rotation);assert(ptr+2==&matr

c++ - 如何处理这些旧式类型转换?

我收到了一些“使用旧式转换”的警告,我想将其删除,但我对此了解不够。编辑:HKEY_CURRENT_USER确实是在WinAPI中定义的,所以我将不理会它。(LPBYTE)&result:LPBYTE(&result)和reinterpret_cast(&result)工作,但我不知道两者是否等效。那么我应该使用这三个中的哪一个?(constBYTE*)&value:reinterpret_cast(&value)有效,但又是同样的事情。那么我应该使用这两者中的哪一个?更多上下文:HKEYhKey;std::stringsResult="";if(regOpenKey(KEY_READ

c# - 与 COM 中的 QueryInterface 或 C++ 中的 dynamic_cast 相比, "as"的成本是多少?

我仍在尝试将我深厚的旧知识从C/C++映射到我较浅的.Net知识。今天是时候在C#中使用“as”(隐含地“is”和cast)了。我对“as”的心理模型是,它是一个QueryInterface或dynamic_cast(一个带有指针参数的dynamic_cast,而不是引用,也就是说)对于C#。我的问题有两个方面:我的比较公平吗?与QueryInterface或dynamic_cast相比,“as”的相对成本是多少? 最佳答案 是的,比较是公平的,尤其是在处理指针时。这三个中的每一个要么成功并返回目标类型的非空指针,要么返回null。

c++ - 原始构造函数与转换转换

这个问题在这里已经有了答案:Whatisthedifferencebetween(type)valueandtype(value)?(5个答案)关闭8年前。有什么区别:longmyLong;floatmyFloat=(float)myLong;和:floatmyFloat=float(myLong);

c++ - 大整数值的定义

我有一个项目,我处理不适合整数的大数字(ns-timestamps)。因此,我想使用例如int64_t,目前正在编写测试用例(是!)。为了检查大量的行为,我从类似的东西开始int64_tval=2*std::numeric_limits::max();qDebug()返回longval-2(就像我将val定义为int一样)。但是如果我写int64_tval=std::numeric_limits::max();val*=2;qDebug()我明白了longval4294967294这看起来是正确的。所以对我来说,似乎2*max()首先存储在一个整数中(在此步骤中被截断),然后复制到in

c++ - 指针是否允许在单继承中更改值?

我知道通过多重继承,指针的值是可以改变的。但是单继承也是这样吗?还是与POD类型有关?你可能知道经典的例子:#includeusingstd::cout;structBase1{virtualvoidf1(){}};structBase2{virtualvoidf2(){}};structDerived:publicBase1,publicBase2{virtualvoidg(){}};intmain(){Derivedd{};auto*pd=&d;autopb1=(Base1*)pd;autopb2=(Base2*)pd;cout到目前为止一切顺利,这是很好的旧编译器实践。对象的布局

c++ - 将 double 组转换为仅具有 double 成员的结构数组而不复制数据

我正在使用第三方C++库在Julia中完成一些繁重的工作。在Julia方面,数据存储在Array{Float64,2}类型的对象中(这大致类似于double的二维数组)。我可以使用指向double的指针将它传递给C++。然而,在C++端,数据存储在名为vector3的结构中:typedefstruct_vector3{doublex,y,z;}vector3;我的快速而肮脏的方法是一个五步过程:在C++端动态分配结构数组将输入数据从double*复制到vector3*做繁重的工作将输出数据从vector3*复制到double*删除动态分配的数组复制大量数据是非常低效的。我可以使用一些神

c++ - 铿锵错误 : ambiguous conversion for static_cast

我有以下代码:typedefintAliasB;typedefunsignedshortAliasA;classAlias{public:explicitAlias(intsomeInt){}};//(*)!!belowbreakstheconversionpathviaAliasA!!//typedefAliasAliasA;classC{public:C(){}};classB{public:B(){}B(constAliasB&value){}operatorAliasB()const{return-1000;}Ccombine(constB&someB){returnC();}

c++ - 为什么允许将 void* 的 static_cast 转换为另一种类型?

我刚刚在读这个帖子:Simplec++pointercasting这让我开始思考为什么不允许在不同指针类型之间进行static_cast(允许的情况除外)除非您将static_cast转换为void*作为中间步骤。在我看来,要么两者都被允许,要么两者都不被允许。这是一个例子:char*cs;unsignedchar*ucs;cs=reinterpret_cast(ucs);//1)allowed,ofcoursecs=static_cast(ucs);//2)notallowed:incompatiblepointertypescs=static_cast(static_cast(uc

c++ - reinterpret_cast<char*>(p) 或 static_cast<char*>((void*)p)) 用于字节指针差异,哪个更好?

在提取用于指针运算的原始字节指针时,以下三种类型转换之间有什么区别吗?(假设char为1个字节的平台。)static_cast((void*)ptr))reinterpret_cast(ptr)(更新)或:static_cast(static_cast(ptr))我应该选择哪个?更详细...给定一个类中两个成员对象的指针,我想计算一个到另一个的偏移量,这样我就可以在给定偏移量的情况下重建一个成员的地址和另一个成员的地址。//assumeddatalayout:structC{//...Aa;//...Bb;}我目前使用的代码是这样的:voidapproach1(A*pa,B*pb){/