小编Gab*_*iel的帖子

默认值,值和零初始化混乱

我对value-&default-&zero-initialization非常困惑.特别是当他们参与不同的标准C++ 03C++ 11(和C++ 14)时.

我引用并试图在这里扩展一个非常好的答案Value-/Default-/Zero-初始化C++ 98C++ 03,以使其更加通用,因为它可以帮助很多用户,如果有人可以帮助填写需要差距,以便对何时发生的情况有一个很好的概述?

通过示例的全面见解简而言之:

有时新运算符返回的内存将被初始化,有时它不会取决于您正在新建的类型是POD(普通旧数据),还是它是一个包含POD成员且正在使用的类编译器生成的默认构造函数.

  • C++ 1998中,有两种类型的初始化:默认初始化
  • C++ 2003第三种类型的初始化中,添加了值初始化.
  • C++ 2011/C++ 2014中,仅添加了列表初始化,并且value-/default-/zero-initialization的规则稍有改变.

假设:

struct A { int m; };                     
struct B { ~B(); int m; };               
struct C { C() : m(){}; ~C(); int m; };  
struct D { D(){}; int m; };             
struct E { …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++03 c++98 c++14

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

如何在CMake中配置可移植并行版本?

无论使用哪种构建工具,都能以某种方式实现并行构建吗?

在Unix下我们可以添加make -jN N是线程数,在Windows下我添加到CXX_FLAG "/MP" 哪个然后在Visual Studio中用于并行构建......?CMAKE_MAKE_PROGRAM当我运行CMake时,如何使我的版本不会总是扩展?

什么是一般解决方案?

我想出了这个:

# Add some multithreaded build support
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
set(MULTITHREADED_BUILD 12 CACHE STRING "How many threads are used to build the project")
if(MULTITHREADED_BUILD)
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
            message(STATUS ${CMAKE_BUILD_TOOL})
            set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j${MULTITHREADED_BUILD}")
            message(STATUS "Added arguments to CMAKE_BUILD_TOOL: ${CMAKE_MAKE_PROGRAM}")
    elseif(MSVC)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
      message(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    endif()
endif()
Run Code Online (Sandbox Code Playgroud)

cmake parallel-builds

43
推荐指数
4
解决办法
3万
查看次数

我可以移动 - 将std :: map的内容分配到另一个std :: map中吗?

是否可以通过使用移动语义将临时std :: map的内容插入temp到另一个std :: map中m,以便临时值不被复制并重用?

让我们说有一个:

std::map<int, Data> temp;
std::map<int, Data> m;
Run Code Online (Sandbox Code Playgroud)

从复制值的一种方法tempm是:

m.insert(temp.begin(),temp.end());
Run Code Online (Sandbox Code Playgroud)

我怎样才能移动temp元素融入m,而不是复制?

c++ move-semantics c++11

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

调试和发布库与CMAKE链接(VISUAL STUDIO)

已经有一个线程没有真正帮助.我希望能够链接例如Foo.lib 用于发布配置和Foo_d.lib调试配置,我怎么能做到这一点?如果我这样做:

target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
Run Code Online (Sandbox Code Playgroud)

那么我的项目中有两个库用于调试配置?为什么没有发布选项?

非常感谢!

c++ cmake visual-studio-2010

21
推荐指数
4
解决办法
2万
查看次数

如何避免const转换为地图访问?

我有以下问题:

std::map<A*,double> map;

void getColor(A const * obj){
    double d = map[obj]; // does not compile wihtout const_cast<A*>(obj)
    // do something
}
Run Code Online (Sandbox Code Playgroud)

我有一个地图std::map(某处)存储指向对象的指针A.我有一个操纵对象的函数getColor, 因此将指针 作为输入.Aconst A

如果getColor不使用const_cast ,函数将无法编译.

const cast是一个设计问题,但如果我不想map const中创建键,我不知道如何规避它.

任何帮助赞赏.

c++ stdmap c++11 c++14

20
推荐指数
2
解决办法
1271
查看次数

删除[]具有不同类型的未定义行为?

我想知道这是否是未定义的行为:

#include <stdint.h>

int main() {
  auto* p = new uint8_t[32];
  float* c = reinterpret_cast<float*>(p);
  delete[] c;
}
Run Code Online (Sandbox Code Playgroud)

标准中

如果不是,则行为未定义.在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或由前一个数组new-expression 79产生的指针值.如果不是,则行为是未定义的.[注意:这意味着delete-expression的语法必须与new分配的对象的类型匹配,而不是new-expression的语法. - 结束说明]

所以解释一些有点不清楚的短语

这意味着delete-expression的语法必须与new分配的对象的类型匹配,而不是new-expression的语法

我可以说上面是未定义的行为,对吗?

c++

17
推荐指数
2
解决办法
1177
查看次数

CUDA块如何分为经线?

如果我使用其网格具有维度的网格启动我的内核:

dim3 block_dims(16,16);
Run Code Online (Sandbox Code Playgroud)

网格块现在如何分成经线?这样一个块的前两行是形成一个warp,还是前两列,还是这个任意排序?

假设GPU计算能力为2.0.

cuda gpgpu gpu-warp

14
推荐指数
1
解决办法
4311
查看次数

部分特化的默认参数[Clang yes,GCC no]

为什么以下编译clang但不编译g++ 4.9

#include <array>

template< typename T1, typename T2 , typename T3 = int>
struct A;

template<typename T, unsigned int N, typename T2, typename T3>
struct A< std::array<T,N>, T2,  T3 > {
    int a;
};

int main()
{
  A< std::array<int,10>, double>  a;
  a.a +=3;
}
Run Code Online (Sandbox Code Playgroud)

http://coliru.stacked-crooked.com/a/c7800f49ba5aac43

g ++没有找到合适的专业化并抱怨"不完整类型".我想知道,因为默认参数typename T3 = int应该适用于专业化(或者它是否只适用于完全专业化?)

c++ gcc clang template-specialization c++11

14
推荐指数
1
解决办法
226
查看次数

如何在使用clang格式的访问修饰符后缩进

如何在访问修饰符后实现以下缩进:

class A{
public:
int a;
}
Run Code Online (Sandbox Code Playgroud)

应该导致

class A
{
    public:
        int a; // note the indentation
}
Run Code Online (Sandbox Code Playgroud)

clang-format只允许访问修饰符与int a AccessModifierOffset: 0结果处于同一级别

class A
{
    public:
    int a;
}
Run Code Online (Sandbox Code Playgroud)

c++ code-formatting clang-format

14
推荐指数
2
解决办法
1502
查看次数

用大括号从double初始化float

为什么编译器(clang,gcc)在执行此操作时没有警告缩小转换

float a{3.1231231241234123512354123512341235123541235};
float a = {double(3.1231231241234123512354123512341235123541235)}
Run Code Online (Sandbox Code Playgroud)

我期待一个警告,因为我使用大括号进行显式值初始化.按照这个答案链接它应该吐出一个错误.

汇编在这里

c++ value-initialization c++11 list-initialization c++14

8
推荐指数
2
解决办法
1013
查看次数