在VC2012中,我想使用唯一指针和删除器在构造函数中创建一个互斥锁,这样我就不需要创建一个析构函数来调用CloseHandle.
我原以为这会起作用:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
Run Code Online (Sandbox Code Playgroud)
但在编译时我收到一个错误:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
Run Code Online (Sandbox Code Playgroud)
当我修改构造函数时:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
Run Code Online (Sandbox Code Playgroud)
我变得更加不寻常:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
Run Code Online (Sandbox Code Playgroud)
我现在不知所措.HANDLE是void*的typedef:我需要了解一些转换魔法吗?
为什么在shared_ptr没有allocate_unique的unique_ptr情况下有allocate_shared?
我想使用自己的分配器创建一个unique_ptr:我是否必须自己分配缓冲区然后将其分配给unique_ptr?
这似乎是一个明显的成语.
考虑以下代码示例:
#include <set>
#include <string>
using namespace std;
set<string> string_set;
void foo(const string& a)
{
pair<set<string>::iterator, bool> insert_result = string_set.insert(a);
string& val = *(insert_result.first);
val += " - inserted";
}
Run Code Online (Sandbox Code Playgroud)
所以,除了正确性之外,例如不检查成功插入等等,这段代码看起来应该允许我在插入后修改字符串,但编译器(VS2010)禁止将迭代器解除引用到非const字符串(我们'重新从VS2005迁移,在没有警告的情况下挥动它.
现在,我知道这应该被禁止,因为它可能使字符串不唯一,我很高兴它以这种方式工作,但在现实世界的情况下,它不是那么明确,因为我想修改不参与等效性测试或排序的不可变数据成员.
我想知道的是,编译器如何知道我不允许这样做,以及如何在不参考文档的情况下知道(无论如何都不提这个)?
干杯,盖伊
在Windows XP及更高版本中,给定一个窗口句柄(HWND),如何判断窗口位置和大小是否无法挽回窗口?例如,如果标题栏可用于光标,则可以将窗口拖回屏幕.我需要发现窗口是否实际可见或至少对用户可用.我想我还需要知道如何检测和响应分辨率变化以及如何处理多个监视器.这似乎是一个相当大的交易.我正在使用C++和常规SDK,因此请限制您对该平台的回答,而不是调用C#或类似的.
我正在研究的游戏系列使用视频编码器/解码器库,它可以生成相当大的文件.我们希望改变一些更高效的东西,特别是H.264或VP8.然而,似乎存在广泛的法律问题,围绕软件许可进行导航,以及对VP8的挑战威胁.
所以我想要的是一个C++标头和库文件,我可以静态链接到游戏以解码高效压缩的视频流.我会考虑提供专利赔偿的商业广告(我们目前正在使用Bink).许可需要与商业产品同情.关于法律情况的答案也会有所帮助......
谢谢!
家伙
我们的下一个产品已经变得太大,无法在运行32位Windows的计算机上进行链接.所有lib文件的总和超过2Gb,只能在64位Windows机器上链接.最终我们将超越这个边界,因为我们的软件往往增长而不是契约,我们使用的是32位链接器(MS Visual Studio 2005):当我们的lib总大小超过3Gb时,我们预计会遇到麻烦.
如何在不修剪代码的情况下减小.lib文件或.obj文件的大小?例如,我们使用了很多模板:有没有办法减少它们的占用空间?有没有办法找出导致膨胀检查.lib/.obj文件的原因?这可以自动化而不是通过眼睛检查吗?2.5Gb是很多文本要比较和比较.
外部约束阻止我们作为单个.exe之外的任何东西进行传输,因此DLL解决方案不可用.
这是我得到的输出 dumpbin AchievementsTable.obj /HEADERS
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file AchievementsTable.obj
File Type: ANONYMOUS OBJECT
ANON OBJECT HEADER VALUES
1 version
14C machine (x86)
4C51334D time date stamp Thu Jul 29 08:52:45 2010
ClassID: {0CB3FE38-D9A5-4DAB-AC9B-D6B6222653C2}
945F size
0 flags
Run Code Online (Sandbox Code Playgroud)
我的所有来源都这样做.我正在使用VisualStudio 2005.我知道有很多COMDAT正在导出,因为.exe随后链接并正确执行:是否有编译器开关我应该避免?这是我正在使用的:
/O1
/Ob2
/Oi
/GT
/GL
/I "..\dxsdk\include" <lots of include paths>
/D "WIN32" <lots of #defines>
/GF
/FD
/MT
/GS-
/Gy
/arch:SSE2
/fp:fast
/GR-
/Fo <directory specified>
/Fd <pdb …Run Code Online (Sandbox Code Playgroud) 如果我看到代码行
#define IO_API __declspec(dllexport)
Run Code Online (Sandbox Code Playgroud)
我会告诉我的同事"IO_API被定义为__declspec(dllexport)".
但是,如果我看到代码行
#define IO_API
Run Code Online (Sandbox Code Playgroud)
我不确定我会简单而毫不含糊地告诉我的同事:任何描述都会略微徘徊.有共同的描述符吗?
编辑:我不是在这里寻找用例,只是成语的名称.
在Windows应用程序中,我有一个包装文件名和缓冲区的类.您使用文件名构造它,您可以查询对象以查看缓冲区是否已填充,如果没有则返回nullptr,如果是,则返回缓冲区地址.当对象超出范围时,释放缓冲区:
class file_buffer
{
public:
file_buffer(const std::string& file_name);
~file_buffer();
void* buffer();
private:
...
}
Run Code Online (Sandbox Code Playgroud)
我想异步将数据放入内存,据我所知,我有两个选择:创建一个缓冲区并通过ReadFileEx使用重叠IO,或者使用MapViewOfFile并触摸另一个线程上的地址.
目前我正在使用ReadFileEx,这会出现一些问题,因为大于16MB的请求容易出现故障:我可以尝试拆分请求,但后来我遇到同步问题,如果在IO之前对象超出范围完成我有缓冲区清理问题.此外,如果快速连续创建类的多个实例,则会非常繁琐.
映射和触摸另一个线程上的数据似乎相当容易,因为我没有上限问题:如果客户端现在绝对必须拥有数据,他们可以简单地取消引用地址,让操作系统担心页面错误并采取阻止命中.
这个应用程序需要支持单核机器,所以我的问题是:另一个软件线程的页面错误是否会比当前线程上的重叠IO更昂贵?他们会拖延这个过程吗?重叠的IO是否以相同的方式停止进程,或者是否存在一些我不明白的操作系统魔法?是否使用重叠IO执行页面错误?
我已经很好地阅读了这些主题:http: //msdn.microsoft.com/en-us/library/aa365199(v = vs.85).aspx(文件管理中的IO概念) http:// msdn. microsoft.com/en-us/library/windows/desktop/aa366556 (v=vs.85) .aspx(文件映射),但我似乎无法推断如何进行性能权衡.
我有一个Excel宏需要很长时间.当我无人看管时,似乎崩溃了Excel(我在任务栏中收到了一条Not Responding消息),但是如果我设置一个每隔五或十秒就会被击中的断点,那就没关系了.麻烦的是,我需要从断点处继续大约25万次(我们要看大约200个小时来执行这个野兽)
我猜测缺少消息泵活动会对内核产生影响,那么我如何刷新消息队列呢?还是我完全吠叫错了树?
顺便说一下,我对此非常陌生,因此非常欢迎文档参考.
干杯,盖伊