我正在研究使用clang的代码完成机制时潜在的代码完成速度.下面描述的流程是我在rtags中发现的Anders Bakken.
翻译单元由守护程序监视文件进行解析以进行更改.这是通过被调用的clang_parseTranslationUnit和相关的函数(reparse*,dispose*)来完成的.当用户在源文件中的给定行和列请求完成时,守护程序将缓存的转换单元传递给源文件的最后保存版本和当前源文件clang_codeCompleteAt.(Clang CodeComplete docs).
传递给clang_parseTranslationUnit(来自CompletionThread :: process,第271行)的标志是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes.传递给clang_codeCompleteAt(来自CompletionThread :: process,第305行)的标志是CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns.
调用clang_codeCompleteAt非常慢 - 即使在完成位置是合法成员访问代码的情况下,也需要大约3-5秒来获得完成,这是文档中提到的预期用例的子集clang_codeCompleteAt.IDE代码完成标准似乎太慢了.有没有办法加速这个?
以下来自Scott Meyers的新C++ 11书中的草稿(第2页,第7-21行)
展开调用堆栈和可能展开调用堆栈之间的区别对代码生成产生了惊人的巨大影响.在noexcept功能,优化不需要保持运行栈在unwindable状态,如有异常会向外传播的功能,也不是他们必须确保在noexcept函数对象在施工相反的顺序应该例外离开此功能被破坏.结果是更多的优化机会,不仅在noexcept函数的主体内,而且在调用函数的站点.这种灵活性仅适用于noexcept功能.具有"throw()"异常规范的函数缺少它,没有异常规范的函数也没有.
相比之下,部分5.4的"关于C++的性能技术报告"描述了"代码"和实施异常处理的"表"的方式.特别是,当没有抛出异常并且只有空间开销时,"table"方法被显示没有时间开销.
我的问题是这个 - 斯科特迈尔斯在谈论解散和可能解散的时候谈到了什么优化?为什么这些优化不适用throw()?他的评论是否仅适用于2006 TR中提到的"代码"方法?
应该使用哪个std::uninitialized_copy和什么时候有什么区别std::copy?
Sean Parent的讲话,继承是邪恶的基类,他说多态不是这种类型的属性,而是它的使用方式.作为一个拇指规则,不要使用继承来实现接口.这样做的许多好处之一是具有虚函数的类的虚拟化只是因为它们实现了一个接口.这是一个例子:
class Drawable
{
public:
virtual void draw() = 0;
};
class DrawA : public Drawable
{
public:
void draw() override{//do something}
};
class UseDrawable
{
public:
void do(){mDraw->draw();}
Drawable* mDraw;
};
Run Code Online (Sandbox Code Playgroud)
在这里,而不是UseDrawable要求mDraw是一个Drawable*,你可以有它使用一种擦除类能够包裹实施了一个名为成员的任何类draw.所以,boost::type_erasure::any具有适当定义的东西.这样,DrawA不需要继承Drawable- 多态性是真正UseDrawable的要求,而不是真正的属性DrawA.
我试图按照这个原则重构一些代码.我有一个抽象类ModelInterface和两个具体的类ModelA并ModelB继承自ModelInterface.继肖恩的建议,这是有道理的不给力ModelA,并ModelB进入继承层次结构和简单的使用类型擦除在需要满足通过建模的概念类的位置ModelInterface.
现在,我的问题是我的代码中当前使用的大多数地方ModelInterface也是通过基于运行时配置文件构造适当的对象来实现的.目前,工厂将new适当的对象并返回一个ModelInterface*.如果我重构代码以boost::type_erasure::any<implement ModelInterface>在代码中的这些位置使用类型擦除的概念(例如类似的东西),我如何在运行时构造这样的对象?将 …
以下内容无法编译clang35 -std=c++11:
#include <iostream>
#include <string>
#include <initializer_list>
class A
{
public:
A(int, bool) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A(int, double) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A(std::initializer_list<int>) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
int main()
{
A a1 = {1, 1.0};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有错误
init.cpp:15:14: error: type 'double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
A a1 = {1, 1.0};
^~~
init.cpp:15:14: note: insert an explicit cast to silence …Run Code Online (Sandbox Code Playgroud) 请问vector<T, std::allocator<T>>::clear()是O(1),如果T是平凡破坏?
gcc在bits/stl_vector.hcalls std::_Destroy(bits/stl_construct.h)中的实现.这种实现方式可以优化T通过标记调度来简单地破坏的情况std::is_trivially_destructible<T>.
通过llvm(3.5.0)实现,vector::clear调用std::allocator<T>::destroy每个元素,然后调用析构函数.
_LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();}
Run Code Online (Sandbox Code Playgroud)
这最终会vector::clear() O(1)在libc ++中进行优化吗?
我分叉了一个项目,拉动并推动.我的github帐户显示了这个:

有没有办法从我的个人资料中删除它?
我已经从设置页面中删除了存储库.
今天我们在浏览器上看到谷歌地图api出现间歇性错误.
Google已禁止将此地图用于此应用程序.提供的密钥不是有效的Google API密钥,也不是Google Maps API密钥的授权,或者未获得此网站上Google Maps Javascript API V3的授权.
在开发人员控制台上,启用了所有地图apis.
我不确定是什么原因导致google maps api抛出此错误.
我们正在使用v3 api显示地图:
script.src = 'https://maps.google.com/maps/api/js?v=3&key='+mapKey+'&language=en-IN&sensor=true&libraries=places&callback=loadInfoBox';
Run Code Online (Sandbox Code Playgroud)
有没有办法知道错误的实际原因是什么?
我有以下traits class(IsLexCastable)来检查是否可以通过调用将类型转换为字符串boost::lexical_cast<string>.它错误地返回true了vector<int>.
#include <iostream>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;
namespace std
{
/// Adding to std since these are going to be part of it in C++14.
template <bool B, typename T = void>
using enable_if_t = typename std::enable_if<B, T>::type;
}
template <typename T, typename = void>
struct IsLexCastable : std::false_type
{
};
template <typename T>
struct IsLexCastable<T, std::enable_if_t<std::is_same<std::string, decltype(boost::lexical_cast<std::string>(std::declval<T>()))>::value> > …Run Code Online (Sandbox Code Playgroud) 我如何less通过-R或以其他方式告诉不要跨换行符(\n)重置颜色?这是我所看到的一个例子:
$ echo -e '\033[31mThis is red.\nStill red.\n\033[0mBack now.' >> coltest
$ cat coltest
This is red. #Colour is red
Still red. #Colour is red
Back now. #Colour is the terminal's foreground colour.
$ less -RF coltest
This is red. #Colour is red
Still red. #Colour is the terminal's foreground colour.
Back now. #Colour is the terminal's foreground colour.
Run Code Online (Sandbox Code Playgroud)
为什么Still red.在输出中重置为终端的前景色的颜色less -RF?
c++ ×7
c++11 ×5
clang ×2
llvm ×2
ansi-colors ×1
bash ×1
boost ×1
colors ×1
factory ×1
github ×1
google-maps ×1
inheritance ×1
libclang ×1
memory ×1
noexcept ×1
stdvector ×1
templates ×1
type-erasure ×1