据我所知,Visual Studio 2015附带了clang.首先我虽然这只适用于Android和iOS应用,但根据这篇文章,它也应该可以使用clang ++前端用于Windows程序.但是,我找不到相应的选项.
那么请你解释一下,如何在c ++项目中改变用过的编译器(在VS2015 RC社区版中).
问题:
有没有办法通过与主存储库相同的方法(ssh或https)自动检出git子模块?
背景:
我们有一个非公开的gitlab存储库(main),它有一个子模块(utils),它也作为非公共gitlab存储库托管在同一台服务器上.可以通过ssh或https访问这些存储库:
user@gitlabserver.com:my/path/repo.githttps://gitlabserver.com/my/path/repo.git两种变体显然都需要不同形式的认证,并且取决于客户端计算机和用户,优选一种或另一种.
对于main不是问题的顶级存储库(),任何人都可以选择他或她喜欢的方法,但对于子模块,这取决于.gitmodules文件,因此(最初)对所有人都是相同的.
现在,而不是每个人都必须将.gitmodules文件调整为他们喜欢的任何内容,并确保他们不会意外地提交这些更改,如果有一种方法只需指定服务器和repo路径并且git选择其中一个,那就太好了.用于主repo的方法,或者可以在gitconfig中设置的方法.
这是什么技术问题std::shared_ptr::unique()是它在C++ 17中被弃用的原因?
根据cppreference.com,std::shared_ptr::unique()在C++ 17中被弃用
从C++ 17开始不推荐使用此函数,因为
use_count它只是多线程环境中的近似值.
我理解这是真的use_count() > 1:虽然我拿着它的引用,但其他人可能会同时放弃他或创建一个新副本.
但是如果use_count()返回1(这是我在调用时感兴趣的话unique())那么就没有其他线程可以以一种活泼的方式改变这个值,所以我希望这应该是安全的:
if (myPtr && myPtr.unique()) {
//Modify *myPtr
}
Run Code Online (Sandbox Code Playgroud)
我发现这个文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0521r0.html建议弃用以回应C++ 17 CD评论CA 14,但我找不到评论本身.
作为替代方案,该文件建议增加一些说明,包括以下内容:
注意:当多个线程可以影响返回值时
use_count(),结果应视为近似值.特别是,use_count() == 1并不意味着通过先前破坏的访问shared_ptr在任何意义上都已完成. - 结束说明
我理解这可能use_count()是当前指定方式的情况(由于缺乏保证的同步),但为什么分辨率不仅仅是指定这样的同步并因此使上述模式安全?如果有一个基本的限制,不允许这种同步(或使其成本高昂),那么如何才能正确实现析构函数?
我忽略了@ alexeykuzmin0和@rubenvb提出的明显案例,因为到目前为止我只unique()在shared_ptr其他线程本身无法访问的实例上使用过.因此,没有任何危险,特定的实例将以一种活泼的方式被复制.
我仍然有兴趣了解CA 14究竟是什么,因为我相信unique()只要保证与shared_ptr其他线程上的不同实例发生的任何事情同步,我的所有用例都会起作用.所以它对我来说似乎仍然是一个有用的工具,但我可能会忽略一些基本的东西.
为了说明我的想法,请考虑以下事项:
class MemoryCache {
public:
MemoryCache(size_t size)
: …Run Code Online (Sandbox Code Playgroud) 我想编写一个cmake文件,在调试和发布版本中为clang ++,g ++和MSVC设置不同的编译器选项.我目前正在做的事情看起来像这样:
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /W4")
# Default debug flags are OK
set(CMAKE_CXX_FLAGS_RELEASE "{CMAKE_CXX_FLAGS_RELEASE} /O2")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall -Wextra -Werror")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} some other flags")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
else()
# nothing special for gcc at the moment
endif()
endif()
Run Code Online (Sandbox Code Playgroud)
但我有几个问题:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} Foo")用append(CMAKE_CXX_FLAGS "Foo")? CMAKE_CXX_FLAGS和类似的变量,但我不知道使用什么其他机制.make foo_debug_clang.所以我的问题是
我在互联网上找到的大多数参考资料要么过时,要么只显示一些简单的例子.我目前正在使用cmake3.8,但如果这有什么不同,我对更新版本的答案更感兴趣.
感谢std::make_shared,我想知道,std::shared_ptr带有原始指针的构造函数是否具有任何值,除非与传统/库代码接口时,例如存储工厂的输出时.
shared_ptr<T>::reset(T*)?关于代码检查:我知道与遗留/库代码的接口很常见,因此自动代码检查可能会有问题,但在目前为止我遇到的大多数情况下,我宁愿使用一个unique_ptr而且我也不是在谈论弹出的编译器警告-Wall,而不是代码审查期间静态代码分析的规则.
我的动机:
相对容易说"不要使用std::shared_ptr<T>(new T(...)),总是喜欢std::make_shared<T>(...)"(我认为这是正确的建议吗?).但是我想知道它是不是一般的设计气味,如果必须shared_ptr从原始指针创建一个,甚至 - 或者特别是 - 如果对象不是仅仅通过创建new,因为该对象应该被创建为首先是"共享"或"独特"的对象.
我想知道是否有可能为任何"常见"架构(如x64或ARMv7/ARMv8)创建无锁,线程安全的共享指针.
在cppcon2014上关于无锁编程的讨论中,Herb Sutter提出了一个无锁定单链表的(部分)实现.实现看起来很简单,但它依赖于shared_ptr标准库中不存在或使用专用std::atomic...函数的原子实现.这一点尤为重要,因为单个push/pop调用可能会调用多个原子加载/存储和compare_exchange操作.
我看到的问题(我认为谈话中的一些问题是朝着相同的方向)是因为这是一个实际的无锁数据结构,那些原子操作本身就必须是无锁的.我不知道任何标准库实现std::atomic...的无锁功能 - 至少有一个简短的google/SO搜索 - 我也没有找到如何实现无锁专业化的建议std::atomic<std::shared_ptr>.
在我浪费时间之前,我想问:
std::atomic<std::shared_ptr>?对于所提到的队列,它尤其需要CAS操作.供参考,这里是来自Herb Sutter的代码(可能包含来自我的错别字):
template<class T>
class slist {
struct Node { T t; std::shared_ptr<Node> next; };
std::atomic<std::shared_ptr<Node>> head;
public:
class reference{
std::shared_ptr<Node> p;
public:
reference(std::shared_ptr<Node> p_){}
T& operator*(){ return p->t; }
T* operator->(){ return &p->t; }
};
auto find(T t) const {
auto p = head.load();
while …Run Code Online (Sandbox Code Playgroud) 比方说,我有一组无符号字符代表一堆POD对象(例如从套接字或通过mmap读取).它们代表哪些类型以及在运行时确定的位置,但我们假设每个类型已经正确对齐.
将这些字节"转换"为相应的POD类型的最佳方法是什么?
解决方案应该符合c ++标准(比方说> = c ++ 11)或者至少可以保证使用g ++> = 4.9,clang ++> = 3.5和MSVC> = 2015U3.编辑:在Linux,Windows上运行x86/x64或32/64位臂.
理想情况下,我想做这样的事情:
uint8_t buffer[100]; //filled e.g. from network
switch(buffer[0]) {
case 0: process(*reinterpret_cast<Pod1*>(&buffer[4]); break;
case 1: process(*reinterpret_cast<Pod2*>(&buffer[8+buffer[1]*4]); break;
//...
}
Run Code Online (Sandbox Code Playgroud)
要么
switch(buffer[0]) {
case 0: {
auto* ptr = new(&buffer[4]) Pod1;
process(*ptr);
}break;
case 1: {
auto* ptr = new(&buffer[8+buffer[1]*4]) Pod2;
process(*ptr);
}break;
//...
}
Run Code Online (Sandbox Code Playgroud)
两者似乎都有效,但两者都是c ++中的AFAIK未定义行为1).而且只是为了完整性:我知道将通常的东西复制到适当的局部变量中的"通常"解决方案:
Pod1 tmp;
std::copy_n(&buffer[4],sizeof(tmp), reinterpret_cast<uint8_t*>(&tmp));
process(tmp);
Run Code Online (Sandbox Code Playgroud)
在某些情况下,它可能不是其他人的开销,在某些情况下甚至可能更快,但性能除外,我不再能够修改数据并且说实话:它让我很生气,知道我有右位在内存中的适当位置,但我不能使用它们.
我想出的一个有点疯狂的解决方案是:
template<class T>
T* inplace_cast(uint8_t* data) {
//checks omitted for …Run Code Online (Sandbox Code Playgroud) 我已通过设置localizedFallbackTitle为"使用密码" 自定义了后备按钮.有效.但是在我将iPhone更新到iOS 8.3之后,TouchID视图上的后备按钮消失了.
这是API更新还是iOS 8.3的错误?
怎么解决?
有谁知道任何工具链/平台/目标组合,其中的最大值size_t是小比的最大值unsigned int?
我认为C和C++标准原则上允许这样做,并且它(理论上)可能对某些奇怪的MCU有用,但我在实践中从未见过这一点.
注意:
我故意用c和c ++标记这个,因为我对这两种语言的答案感兴趣(如果你的答案是特定于语言的,请说明),我还没有看到任何使用不同大小的工具链/目标组合对于c和c ++中的那些类型无论如何.