jjzjj

c++ - 为什么需要间接寻址

这个问题在这里已经有了答案:CreatingCmacrowith##and__LINE__(tokenconcatenationwithpositioningmacro)(3个答案)关闭6年前。考虑以下宏:#defineCAT(X,Y)X##Y#defineCMB(A,B)CAT(A,B)#defineSLB_LOGGING_ALGORITHMCMB(Logging,SLB_ALGORITHM)其中SLB_ALGORITHM是定义的预处理器符号。如果我直接使用CAT而不是CMB,则SLB_ALGORITHM不会展开。为什么会这样?间接寻址究竟有何帮助?

c++ - 内联 lambda 是否会遭受与函数指针间接寻址相同的延迟

//approach1templatevoidf1(Tt,inta,intb){t(a,b);}//approach2voidf2(void(*g)(int,int),inta,intb){g(a,b);}voidg(inta,intb){//dosomething}intmain(){f1([](inta,intb){//dosomething},1,2);f2(&g,1,2);}我的问题是,f1和f2是否遭受相同的间接寻址延迟以获取要执行的函数的地址(假定lambda实现为函数对象)?如果lambda不是内联的怎么办?注意:我将函数f1声明为模板,以便将参数lambda类型的推导留

c++ - 是否有一种非间接、非 hack 的方法来保证 constexpr 函数只能在编译时调用?

目前,我们有两个主要的编译时评估选项:模板元编程(通常使用模板结构和/或变量)和constexpr操作1。templatestructsum_{enum{value=l+r};};//Withstruct.templateconstintsum=sum_::value;//Withstruct&var.templateconstintsub=l-r;//Withvar.constexprintmul(intl,intr){returnl*r;}//Withconstexpr.其中,我们保证所有四个都可以在编译时求值。templatestructCompileTimeEvaluable{

c++ - 可以使用 std::remove_pointer 从指针类型中删除所有间接寻址吗?

假设我有..int、int*、int**等。我可以使用std::remove_pointer或类似工具直接输入int吗?谢谢 最佳答案 是的。templatestructremove_all{typedefTtype;};templatestructremove_all{typedeftypenameremove_all::typetype;};std::remove_pointer本身在这里用处不大。 关于c++-可以使用std::remove_pointer从指针类型中删除所有间接寻

c++ - 哪个更快?函数调用还是条件 if 语句?

在回答这个问题之前,请考虑分支预测。在某些情况下,我可以在函数指针的帮助下将条件语句替换为对函数的调用。类似这样的事情。(对于类似类型的senario,您可以考虑基于组件的编程而不是继承)classShape{floatArea(){if(type==SQUARE){returnlength*length;}elseif(type==RECTANGLE){returnlength*breadth;}}}同一个类可以这样写。classShape{voidSetAreaFunction(void*funcptr)//thisfunctionisusedtosetthecurrentArea

c++ - 如何优化间接基数排序? (又名如何优化不可预测的内存访问模式)

我用C++编写了一个间接基数排序算法(间接,我的意思是它返回项目的索引):#include#include#includetemplatevoidradix_ipass(It1begin,It1constend,It2consta,size_tconsti,std::vector>&buckets){size_tncleared=0;for(It1j=begin;j!=end;++j){size_tconstk=a[*j][i];while(k>=ncleared&&ncleared=buckets.size()){buckets.resize(k+1);ncleared=bucket

c++ - 使用间接父类的方法

考虑以下代码:classuser_error:publicstd::runtime_error{public:usingstd::exception::what;explicituser_error(conststd::string&what_arg):std::runtime_error(what_arg){}};classwith_overriden_what:publicuser_error{public:with_overriden_what(conststd::string&val):user_error("user_error"),message(val){}std::st

c++ - 有间接仿函数吗?

我正在寻找一个一元仿函数,它将取消引用它的参数并返回结果。我当然可以写一个,只是看起来有些东西应该已经存在了。所以给定代码:constautovals={0,1,2,3};vectortest(size(vals),nullptr);iota(begin(test),end(test),data(vals));transform(cbegin(test),cend(test),ostream_iterator(cout,""),[](constauto&i){return*i;});LiveExample我希望有一个仿函数可以用来代替lambda。是否存在这样的事情,还是我只需要使用l

c++ - 关于 deque<T> 的额外间接寻址

想知道为什么我的内存访问比我预期的要慢一些,我终于发现deque的VisualC++实现确实有一个extra内置的间接层,破坏了我的内存位置。即它似乎包含一个T*数组,而不是一个T数组。是否有另一个我可以与VC++一起使用的没有此“功能”的实现,或者是否有某种方法(尽管我认为这不太可能)能够在此实现中避免它?我基本上是在寻找一个vector,它在前面也有O(1)推/弹出。我想我可以自己实现它,但是处理allocator之类的东西很痛苦,需要一段时间才能正确完成,所以如果可能的话,我宁愿使用以前编写/测试过的东西。 最佳答案 无论出于

c++ - 在 C++ 中重载间接运算符

这个问题在这里已经有了答案:Howtooverloadtheindirectionoperator?(C++)(2个答案)关闭8年前。我的问题很简单。我有一个类模板,它包含一个指向动态分配类型的指针。我想重载间接运算符,以便使用->运算符引用类模板实例时,我会被重定向,就好像我直接使用其中包含的指针一样。templateclassMyClass{T*ptr;...//createddynamicresourceforptrintheconstructor};创建某种类型的myclass:MyClassinstance;所以我想要的是不必键入:instance.ptr->someMemb