在禁用 SDL 检查的情况下在 Release 配置中编译以下代码:
#include <immintrin.h>
int main()
{
const auto Set128Epi16 = []()
{
#ifdef NDEBUG
#pragma warning( push )
#pragma warning( disable : 4700 )
__m128i x = _mm_cmpeq_epi16( x,x );
x = _mm_srli_epi16( x,15 );
return _mm_slli_epi16( x,7 );
#pragma warning( pop )
#else
__m128i x = _mm_setzero_si128();
x = _mm_cmpeq_epi16( x,x );
x = _mm_srli_epi16( x,15 );
return _mm_slli_epi16( x,7 );
#endif
};
const auto xmm = Set128Epi16();
return *xmm.m128i_i32;
}
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
1>------ Rebuild All …Run Code Online (Sandbox Code Playgroud) 我正在创建一个简单的框架,用于在 C++/D3D11 下教授基本的图形概念。该框架需要能够通过简单的界面功能(例如Putpixel( x,y,r,g,b ))直接操作屏幕光栅内容。
在 D3D9 下,这是一个相对简单的目标,通过在 CPU 构成表面的堆上分配表面缓冲区来实现。然后后台缓冲区将被锁定,堆缓冲区的内容将传输到后台缓冲区。据我了解,在 D3D11 下无法直接从 CPU 访问后台缓冲区。必须准备一个纹理资源,然后通过一些全屏几何图形将其绘制到后台缓冲区。
我已经为这样的程序考虑了两个系统。第一个包括D3D11_USAGE_DEFAULT纹理和D3D11_USAGE_STAGING纹理。暂存纹理首先被映射,然后从 CPU 中绘制。当场景完成时,暂存纹理被取消映射并复制到默认纹理CopyResource(如果我没记错的话,它使用 GPU 执行复制),然后通过全屏纹理四边形将默认纹理绘制到后台缓冲区。
第二个系统包括D3D11_USAGE_DYNAMIC在堆上分配的纹理和帧缓冲区。当场景组成时,动态纹理被映射,堆缓冲区的内容通过 CPU 复制到动态纹理,动态纹理被取消映射,然后通过全屏纹理四边形绘制到后台缓冲区。
我的印象是通过读写访问创建的纹理D3D11_USAGE_STAGING将驻留在系统内存中,但我运行的性能测试似乎表明情况并非如此。也就是说,通过 CPU 绘制一个简单的 200x200 填充矩形比使用堆缓冲区慢大约 3 倍(两种情况下完全相同的反汇编(紧密rep stos循环)),强烈暗示临时纹理驻留在图形适配器内存中。
我更喜欢使用暂存纹理系统,因为它允许将渲染到后台缓冲区的工作和从系统内存复制到图形内存的工作卸载到 GPU 上。但是,无论如何,我想优先考虑 CPU 访问速度而不是这种能力。
那么什么方法方法最适合这个用例呢?对我的两种方法的任何提示、修改或完全不同方法的建议将不胜感激。
根据下面广为人知的表格,当用户提供一个或多个复制赋值、复制构造函数和析构函数时,C++11 中不推荐自动编译器生成默认复制构造函数和复制赋值(红色单元格表示弃用)。考虑到“三法则”,这是完全有道理的。但是,该表显示,在用户提供的复制构造函数/赋值的情况下,默认析构函数的生成并未被弃用。
这个设计决定背后的理由是什么?

我使用的是有麻烦std::bind与std::make_unique.
我有一个对象,其构造函数我传递工厂函数来std::unique_ptr生成另一个类类型的对象.
使用VS2013,这有效:
Tester tester(
[](){return std::make_unique<AlphaBetaSingleThreadSSE>( 0,7 ); },
[](){return std::make_unique<AlphaBetaSingleThread>( 0,7 ); },
20 );
Run Code Online (Sandbox Code Playgroud)
这给了我编译错误:
Tester tester(
std::bind( std::make_unique<AlphaBetaSingleThreadSSE>,0,7 ),
std::bind( std::make_unique<AlphaBetaSingleThread>,0,7 ),
20 );
Run Code Online (Sandbox Code Playgroud)
错误消息说明:
错误C2512:'AlphaBetaSingleThread':没有合适的默认构造函数可用
错误C2512:'AlphaBetaSingleThreadSSE':没有合适的默认构造函数可用
为什么这种std::bind方法失败了?
我的印象是未格式化的write()会将字节逐字复制到ostream调用它的地方。另一位 SO 用户还告诉我,'Write 函数不会跳过任何内容。如果您在使用时遇到问题stringstream,请提出问题。
但是,在最近使用的一些代码中,stringstream我发现情况并非如此。
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <iterator>
int main()
{
{
const std::string msg = "This is a secret message!";
std::stringstream ss;
const int size = msg.size();
// ss << std::noskipws;
ss.write( reinterpret_cast<const char*>(&size),sizeof( size ) );
ss.write( msg.data(),msg.size() );
std::ofstream out( "secret.txt",std::ios::binary );
std::transform( std::istream_iterator<char>( ss ),std::istream_iterator<char>(),
std::ostream_iterator<char>( out ),[]( const char c ) { return c + 113; } );
}
{ …Run Code Online (Sandbox Code Playgroud) c++ ×5
c++11 ×2
direct3d11 ×1
directx ×1
directx-11 ×1
pragma ×1
stdbind ×1
unique-ptr ×1
warnings ×1