我对value-&default-&zero-initialization非常困惑.特别是当他们参与不同的标准C++ 03和C++ 11(和C++ 14)时.
我引用并试图在这里扩展一个非常好的答案Value-/Default-/Zero-初始化C++ 98和C++ 03,以使其更加通用,因为它可以帮助很多用户,如果有人可以帮助填写需要差距,以便对何时发生的情况有一个很好的概述?
通过示例的全面见解简而言之:
有时新运算符返回的内存将被初始化,有时它不会取决于您正在新建的类型是POD(普通旧数据),还是它是一个包含POD成员且正在使用的类编译器生成的默认构造函数.
假设:
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) 无论使用哪种构建工具,都能以某种方式实现并行构建吗?
在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) 是否可以通过使用移动语义将临时std :: map的内容插入temp到另一个std :: map中m,以便临时值不被复制并重用?
让我们说有一个:
std::map<int, Data> temp;
std::map<int, Data> m;
Run Code Online (Sandbox Code Playgroud)
从复制值的一种方法temp为m是:
m.insert(temp.begin(),temp.end());
Run Code Online (Sandbox Code Playgroud)
我怎样才能移动的temp元素融入m,而不是复制?
已经有一个线程没有真正帮助.我希望能够链接例如Foo.lib 用于发布配置和Foo_d.lib的调试配置,我怎么能做到这一点?如果我这样做:
target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
Run Code Online (Sandbox Code Playgroud)
那么我的项目中有两个库用于调试配置?为什么没有发布选项?
非常感谢!
我有以下问题:
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中创建键,我不知道如何规避它.
任何帮助赞赏.
我想知道这是否是未定义的行为:
#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的语法
我可以说上面是未定义的行为,对吗?
如果我使用其网格具有维度的网格启动我的内核:
dim3 block_dims(16,16);
Run Code Online (Sandbox Code Playgroud)
网格块现在如何分成经线?这样一个块的前两行是形成一个warp,还是前两列,还是这个任意排序?
假设GPU计算能力为2.0.
为什么以下编译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应该适用于专业化(或者它是否只适用于完全专业化?)
如何在访问修饰符后实现以下缩进:
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) 为什么编译器(clang,gcc)在执行此操作时没有警告缩小转换
float a{3.1231231241234123512354123512341235123541235};
float a = {double(3.1231231241234123512354123512341235123541235)}
Run Code Online (Sandbox Code Playgroud)
我期待一个警告,因为我使用大括号进行显式值初始化.按照这个答案链接它应该吐出一个错误.