小编Mik*_*eMB的帖子

如何在Visual Studio 2015中使用clang编译C++ for Windows

据我所知,Visual Studio 2015附带了clang.首先我虽然这只适用于Android和iOS应用,但根据这篇文章,它也应该可以使用clang ++前端用于Windows程序.但是,我找不到相应的选项.

那么请你解释一下,如何在c ++项目中改变用过的编译器(在VS2015 RC社区版中).

c++ visual-studio clang++ visual-studio-2015

42
推荐指数
2
解决办法
3万
查看次数

通过ssh或https自动访问git子模块

问题:
有没有办法通过与主存储库相同的方法(ssh或https)自动检出git子模块?

背景:

我们有一个非公开的gitlab存储库(main),它有一个子模块(utils),它也作为非公共gitlab存储库托管在同一台服务器上.可以通过ssh或https访问这些存储库:

  • user@gitlabserver.com:my/path/repo.git
  • https://gitlabserver.com/my/path/repo.git

两种变体显然都需要不同形式的认证,并且取决于客户端计算机和用户,优选一种或另一种.

对于main不是问题的顶级存储库(),任何人都可以选择他或她喜欢的方法,但对于子模块,这取决于.gitmodules文件,因此(最初)对所有人都是相同的.
现在,而不是每个人都必须将.gitmodules文件调整为他们喜欢的任何内容,并确保他们不会意外地提交这些更改,如果有一种方法只需指定服务器和repo路径并且git选择其中一个,那就太好了.用于主repo的方法,或者可以在gitconfig中设置的方法.

git git-submodules gitlab

40
推荐指数
2
解决办法
6863
查看次数

为什么不赞成使用std :: shared_ptr :: unique()?

这是什么技术问题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)

c++ multithreading shared-ptr c++17

31
推荐指数
2
解决办法
3466
查看次数

在跨平台cmake项目中设置编译器标志的现代方法

我想编写一个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)

但我有几个问题:

  1. 首先简单:有没有像relly澳鹏,让我来代替没有命令set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} Foo")append(CMAKE_CXX_FLAGS "Foo")
  2. 我已多次阅读,一个人不应该首先手动设置CMAKE_CXX_FLAGS和类似的变量,但我不知道使用什么其他机制.
  3. 最重要的是:我在这里的方式,我需要为每个编译器和配置单独的构建目录理想情况下,我想将其转换为同一目录中的多个目标,以便我可以调用make foo_debug_clang.

所以我的问题是

  • a)有没有更好的方法来编写解决我的"痛点"的cmake脚本?解决上述问题?
  • b)是否有类似于如何建立此类项目的现代最佳实践?

我在互联网上找到的大多数参考资料要么过时,要么只显示一些简单的例子.我目前正在使用cmake3.8,但如果这有什么不同,我对更新版本的答案更感兴趣.

c++ cmake

31
推荐指数
2
解决办法
1万
查看次数

gcc中c ++ 11支持的官方状态

不是关于gcc支持哪些c ++ 11功能的问题(我相信自4.8以来c ++ 11支持非常完整),但是如果在生产代码中使用它们有任何已知问题.

我问的原因是我查看了gcc5.2手册,并在"GCC支持的语言标准"一节中读到:

[...]其中大部分已在GCC 的实验性 C++ 11模式中实施.

实验这个词让我有点担心,但另一方面,甚至没有提到c ++ 14,尽管我相信GCC也支持所有这些功能.那么这只是对文档的疏忽,还是在使用gcc5.2(4.8)编译的生产代码中使用c ++ 11特性时是否存在任何有效的问题?

c++ gcc c++11

19
推荐指数
1
解决办法
2572
查看次数

我什么时候想从原始指针构造共享指针

感谢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,因为该对象应该被创建为首先是"共享"或"独特"的对象.

c++ shared-ptr c++11

17
推荐指数
3
解决办法
1313
查看次数

Atomic shared_ptr用于无锁单链表

我想知道是否有可能为任何"常见"架构(如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实现中的任何其他好处?

供参考,这里是来自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)

c++ lock-free shared-ptr data-structures stdatomic

16
推荐指数
2
解决办法
4138
查看次数

将字节数组转换为POD

比方说,我有一组无符号字符代表一堆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)

c++ strict-aliasing

16
推荐指数
1
解决办法
657
查看次数

ios8.3中LAContext Not Support中的自定义用户回退按钮

我已通过设置localizedFallbackTitle为"使用密码" 自定义了后备按钮.有效.但是在我将iPhone更新到iOS 8.3之后,TouchID视图上的后备按钮消失了.

这是API更新还是iOS 8.3的错误?

怎么解决?

ios touch-id ios8.3

13
推荐指数
1
解决办法
1986
查看次数

size_t的大小与unsigned int的比较

有谁知道任何工具链/平台/目标组合,其中的最大值size_t比的最大值unsigned int

我认为C和C++标准原则上允许这样做,并且它(理论上)可能对某些奇怪的MCU有用,但我在实践中从未见过这一点.

注意:
我故意用c和c ++标记这个,因为我对这两种语言的答案感兴趣(如果你的答案是特定于语言的,请说明),我还没有看到任何使用不同大小的工具链/目标组合对于c和c ++中的那些类型无论如何.

c c++

13
推荐指数
1
解决办法
316
查看次数