草庐IT

c++ - 如何消除在 switch case 中使用 goto

基本上我想接受来自用户的特定字符,然后使用switchcase将与该字符大小写相关的字符串传递给另一个函数。例如。casei:strcpy(str,"ice-cream");other_function(str);break;如果用户打印了任何默认字符,那么它应该打印默认语句并再次从用户那里获取字符并检查其大小写。我使用goto完成了此操作,但是是否有任何其他选项可用于避免或替换此代码中的goto。p:{cout>c;switch(c){chart[20];case's':strcpy(t,"saving");a[i].setype(t);break;case'c':strcpy(t,

c++ - clang++ 3.3 静态分析器,如何消除误报?

我一直在为我的多个项目运行clang3.3的静态分析器。除了一些问题是我自己的错(这是意料之中的,否则我会非常悲伤和自鸣得意),除了以下关于std::function的问题外,一切都非常顺利移动构造函数,这是误报。在进一步讨论之前,这里有一个简单的测试用例:intmain(){std::functionf1;std::functionf2=std::move(f1);}通过clang++-std=c++11--analyze-Xanalyzer-analyzer-output=textfoo.cpp运行它(它使用GCC的libstdc++——即4.8.1版本——不是clang的libc

android - 任何支持 48 kHz 的声学回声消除 (AEC) 库?

我正在开发一个以48kHz采样率运行的VoIP应用程序。由于它使用内部使用48kHz的Opus作为其编解码器,并且大多数当前的Android硬件本身以48kHz运行,因此AEC是我现在唯一缺少的拼图。我已经找到了WebRTC实现,但我似乎无法弄清楚如何让它工作。看起来它会随机破坏内存,迟早会导致整个系统崩溃。当它不崩溃时,声音有点粗,好像它在画面的一半更安静。这是我处理20毫秒帧的代码:webrtc::SplittingFilter*splittingFilter;webrtc::IFChannelBuffer*bufferIn;webrtc::IFChannelBuffer*buff

c++ - 消除运算符重载中的临时变量

注意:正如sellibitze所指出的,我不是最新的右值引用,因此我提出的方法包含错误,请阅读他的回答以了解错误。我正在阅读Linus'rant中的一篇昨天有(某处)反对运算符重载的咆哮。提示似乎是,如果你有一个S类型的对象,那么:Sa=b+c+d+e;可能涉及很多临时对象。在C++03中,我们有复制省略来防止这种情况:Sa=((b+c)+d)+e;我希望最后的...+e得到优化,但我想知道有多少临时文件是用用户定义的operator+创建的。线程中有人建议使用表达式模板来处理这个问题。现在,这个线程可以追溯到2007年,但现在当我们想到消除临时变量时,我们会想到Move。所以我在考虑

c++ - 为什么不允许在 const 非 volatile 成员函数上消除公共(public)子表达式?

C++的目标之一是允许用户定义类型的行为与内置类型一样好。这似乎失败的一个地方是编译器优化。如果我们假设const非volatile成员函数在道德上等同于读取(对于用户定义的类型),那么为什么不允许编译器消除对此类函数的重复调用呢?例如classC{...public:intget()const;}intmain(){Cc;intx{c.get()};x=c.get();//whynotallowthecompilertoeliminatethiscall}允许这样做的论点与复制省略的论点相同:虽然它改变了操作语义,但它应该适用于遵循良好语义实践的代码,并在效率/模块化方面提供实质性改

c++ - 我应该使用什么类型的迭代器差异来消除 "possible loss of data"警告?

我需要一个通用的x64模式警告规则。哪种方式更好?考虑以下几行代码constintN=std::max_element(cont.begin(),cont.end())-cont.begin();或constintARR_SIZE=1024;chararr[ARR_SIZE];//...constintN=std::max_element(arr,arr+ARR_SIZE)-arr;这是我常用的代码。我对x86没有任何问题。但是如果我在x64模式下运行编译器,我会收到一些警告:conversionfrom'std::_Array_iterator::difference_type'to

c++ - 如何消除重载模板函数的歧义?

以下代码有问题。虽然第1部分没问题,但问题出在main()的第2部分。编译时,会显示一条不明确的错误消息。如何更改代码以解决歧义?templatevoidfunc(Argarg){arg();}templatevoidfunc(Argarg,Args...args){func(args...);arg();}templatevoidfunc(Container&c){for(typenameContainer::reverse_iteratori=c.rbegin();i!=c.rend();++i){(*i)();}}voidf(){std::cout>v{f,f};func(v);

c++ - 编译时消除虚拟表?

假设我有这个层次结构:classSuper{public:virtualvoidbar();};classSub:publicSuper{public:virtualvoidbar()override;};有没有办法让我在使用virtual关键字的情况下避免vtables?(好奇心)我读过一些关于编译器优化的文章,当对象在编译期间已知时,它会消除vtables,我不太确定,在谷歌上搜索了一段时间,但找不到任何答案,这是否意味着这些?Subsb;sb.bar();//avoidsvtable?Super&sr=sb;sr.bar();//avoidsvtable?Super*srp=&s

c++ - C++ 编译器能否消除未读取的 volatile 局部变量

比如说,我有这段代码:intf(){volatileintc;c=34;returnabc();}永远不会读取volatileintc。但是它被标记为volatile,编译器能不能完全消除它呢?我在VisualC++2010中的测试显示了相互矛盾的结果。在VC++中,如果我启用优化(最大化速度),则上述函数包含一个名为c的局部变量(通过查看生成的汇编列表)。但是,我没有使用赋值运算符,而是尝试通过编译器内部函数(如memset())初始化变量(并启用使用编译器内部函数),变量被消除。intf(){volatileintc;memset((void*)&c,34,1);returnabc

c++ - 为什么需要 move 语义来消除临时拷贝?

所以我对move语义的理解是,它们允许您覆盖用于临时值(右值)的函数,并避免可能昂贵的拷贝(通过将状态从未命名的临时值move到您命名的左值)。我的问题是为什么我们需要特殊的语义?为什么C++98编译器不能省略这些拷贝,因为是编译器决定给定表达式是左值还是右值?例如:voidfunc(conststd::string&s){//Dosomethingwiths}intmain(){func(std::string("abc")+std::string("def"));}即使没有C++11的move语义,编译器仍然应该能够确定传递给func()的表达式是右值,因此不需要从临时对象进行复制