小编Ale*_*ter的帖子

C++函数注释的最佳实践

评论功能是否有公认的最佳实践?我只知道doxygen风格,但C++没有正式支持它,就像Javadocs是Java一样,只是想知道什么是最好的.

c++ comments coding-style

52
推荐指数
5
解决办法
7万
查看次数

将一个std :: vector附加到另一个stnd :: vector的最有效方法是什么?

设v1为目标向量,v2需要附加到后面.

我现在在做:

v1.reserve(v1.size() + v2.size()); 
copy(v2.begin(), v2.end(), back_inserter(v1));
Run Code Online (Sandbox Code Playgroud)

这是最有效的方式吗?或者它可以通过复制一块内存来完成?谢谢!

c++ performance stl vector

50
推荐指数
4
解决办法
5万
查看次数

您使用C++中的哪种Typesafe枚举?

众所周知,C++中的内置枚举不是类型安全的.我想知道实现类型安全枚举的哪些类在那里使用...我自己使用以下"自行车",但它有点冗长和有限:

typesafeenum.h:

struct TypesafeEnum
{
// Construction:
public:
    TypesafeEnum(): id (next_id++), name("") {}
    TypesafeEnum(const std::string& n): id(next_id++), name(n) {}

// Operations:
public:
    bool operator == (const TypesafeEnum& right) const;
    bool operator != (const TypesafeEnum& right) const;
    bool operator < (const TypesafeEnum& right) const;

    std::string to_string() const { return name; }

// Implementation:
private:
    static int next_id;
    int id;
    std::string name;
};
Run Code Online (Sandbox Code Playgroud)

typesafeenum.cpp:

int TypesafeEnum::next_id = 1;

bool TypesafeEnum::operator== (const TypesafeEnum& right) const 
{ return id == right.id; }

bool TypesafeEnum::operator!= …
Run Code Online (Sandbox Code Playgroud)

enums design-patterns enumeration type-safety c++03

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

减少cpp翻译单元的数量是一个好主意吗?

我发现如果有很多类,当我每个类使用一个*.h和一个*.cpp文件时,编译时间会大大增加.我已经使用预编译头和增量链接,但编译时间仍然很长(是的,我使用boost;)

所以我想出了以下技巧:

  • 将*.cpp文件定义为不可编译
  • 将*.cxx文件定义为可编译
  • 每个应用程序模块添加一个*.cxx文件,#include此模块的所有*.cpp文件.

因此,我只有8个翻译单元,而不是100多个翻译单元.编译时间缩短了4-5倍.

缺点是您必须手动包含所有*.cpp文件(但它不是真正的维护噩梦,因为如果您忘记包含链接器将提醒您的内容),并且某些VS IDE便利不适用于此方案,例如转到/转移到实施等

所以问题是,有很多cpp翻译单元真的是唯一真正的方法吗?我的伎俩是一种已知的模式,还是我错过了什么?谢谢!

c++ performance build-process module header-files

13
推荐指数
2
解决办法
1080
查看次数

如何在Swift中编写通用的apply()函数?

有没有办法让以下工作在Swift 3?

 let button = UIButton().apply {
        $0.setImage(UIImage(named: "UserLocation"), for: .normal)
        $0.addTarget(self, action: #selector(focusUserLocation), 
                     for: .touchUpInside)
        $0.translatesAutoresizingMaskIntoConstraints = false
        $0.backgroundColor = UIColor.black.withAlphaComponent(0.5)
        $0.layer.cornerRadius = 5
     }
Run Code Online (Sandbox Code Playgroud)

apply<T>函数应该采用类型的闭包(T)->Void,运行它self进入它,然后简单地返回self.

另一种选择是使用像" =>" 这样的操作符(借用KotlinXtend语言的想法).

试图做这样的扩展NSObject:

extension NSObject {   
    func apply<T>(_ block: (T)->Void) -> T
    {
        block(self as! T)
        return self as! T
    }
}
Run Code Online (Sandbox Code Playgroud)

但它需要在闭包中显式声明参数类型:

let button = UIButton().apply { (it: UIButton) in
        it.setImage(UIImage(named: "UserLocation"), for: .normal)
        it.addTarget(self, action: …
Run Code Online (Sandbox Code Playgroud)

functional-programming ios swift

13
推荐指数
3
解决办法
2990
查看次数

有人在C++/WinAPI中有类似FileSystemWatcher的类吗?

我需要原始C++/WinAPI中的.Net的FileSystemWatcher模拟.我几乎开始使用FindFirstChangeNotification/FindNextChangeNotification来编写一个代码,但后来我发现我可能不是第一个需要这个并且可能有人愿意分享的人.

理想情况下我需要的是一个可以按如下方式使用的类:

FileWatcher fw;
fw.startWatching("C:\MYDIR", "filename.dat", 
     FileWatcher::SIZE | FileWatcher::LAST_WRITE,
     &myChangeHandler);
...
fw.stopWatching();
Run Code Online (Sandbox Code Playgroud)

或者,如果它会使用像boost :: signal这样的东西,它会更好.但是,除了标准库,提升和原始WinAPI之外,没有其他依赖项.谢谢!

c++ winapi filesystemwatcher

11
推荐指数
3
解决办法
1万
查看次数

Heisenbug:WinApi程序在某些计算机上崩溃

请帮忙!我真的很有智慧.我的程序是一个小的个人笔记管理器(google为"cintanotes").在某些计算机上(当然我没有它们),它在启动后就会出现未处理的异常.除了他们倾向于拥有AMD CPU之外,没有任何关于这些计算机的特别之处.

环境:Windows XP,Visual C++ 2005/2008,原始WinApi.

以下是"Heisenbug"的确定内容:

1)崩溃只发生在Release版本中.

2)一旦删除所有与GDI相关的东西,崩溃就会消失.

3)BoundChecker没有抱怨.

4)编写日志表明崩溃发生在本地int变量的声明中!怎么会这样?内存腐败?

任何想法将不胜感激!

更新:我设法在"有故障"的PC上调试应用程序.结果:

"CintaNotes.exe中0x0044a26a处的未处理异常:0xC000001D:非法指令."

和代码中断

0044A26A cvtsi2sd xmm1,dword ptr [esp + 14h]

所以似乎问题出现在"代码生成/启用增强指令集"编译器选项中.它设置为"/ arch:SSE2"并且在不支持SSE2的计算机上崩溃.我已将此选项设置为"未设置",并且错误消失了.唷!

非常感谢大家的帮助!!

c++ crash debugging winapi gdi

9
推荐指数
2
解决办法
2091
查看次数

一个轻量级的XML解析器,对大文件有效吗?

我需要解析潜在的巨大XML文件,所以我猜这会排除DOM解析器.

有没有适合C++的轻量级SAX解析器,与足迹上的TinyXML相比?XML的结构非常简单,不需要像名称空间和DTD这样的高级内容.只是元素,属性和cdata.

我知道Xerces,但它超过50mb的超大尺寸让我颤抖.

谢谢!

c++ xml parsing sax saxparser

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

使用ReadDirectoryChangesW是否需要管理员权限?

MSDN表示使用ReadDirectoryChangesW意味着调用进程具有备份和还原权限.

这是否意味着只有在管理员帐户下启动的流程才能正常运行?

我尝试了以下代码,它在作为受限用户运行时无法启用所需的权限.

void enablePrivileges() 
{       
    enablePrivilege(SE_BACKUP_NAME);
    enablePrivilege(SE_RESTORE_NAME);
}

void enablePrivilege(LPCTSTR name) 
{       
    HANDLE hToken;    
    DWORD status;
    if (::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))  
    {        
        TOKEN_PRIVILEGES tp = { 1 };   
        if( ::LookupPrivilegeValue(NULL, name,  &tp.Privileges[0].Luid) )
        {
            tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            BOOL result = ::AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
            verify (result != FALSE);
            status = ::GetLastError();      
        }
        ::CloseHandle(hToken); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?是否有从非管理员用户帐户使用ReadDirectoryChangesW的解决方法?似乎.NET的FileSystemWatcher可以做到这一点.谢谢!

更新:这是该类的完整代码:

  class DirectoryChangesWatcher
  {
  public:
   DirectoryChangesWatcher(wstring directory)
   {
    enablePrivileges();

    hDir = ::CreateFile(directory.c_str(), 
     FILE_LIST_DIRECTORY | FILE_FLAG_OVERLAPPED, 
     FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 
     FILE_FLAG_BACKUP_SEMANTICS, …
Run Code Online (Sandbox Code Playgroud)

c++ security winapi notifications filesystemwatcher

8
推荐指数
1
解决办法
1442
查看次数

如何在 Qt Widgets 中比 QPainter.drawText 更快地绘制文本?

我正在实现一个自定义文本布局引擎,我需要一个简单的文本输出函数,它的功能类似于 WinAPI 的 TabbedTextOut。也就是说,它不应该包装单词或类似的东西。

为此,QPainter 的 drawText 似乎很慢。一般来说,它不是很快,但一些 Unicode 字符(笑脸)可能导致渲染耗时长达 500 毫秒(在 Ryzen 3900x 上)!与 TabbedTextOut 相比,它可能做了很多不必要的事情,这显然会导致巨大的问题。

我不想求助于依赖平台的解决方案。我认为应该有一种方法可以大大加快速度。

我试过的:

  • 准备要在工作线程中绘制为 QImage 的文本(实际上是 thead 池)。效果很好,但快速滚动会导致缓存未命中和跳帧。而且图片缓存占用大量内存!
  • QML 的列表视图。并没有那么快,我宁愿坚持只使用小部件的解决方案。
  • 使用 QStaticText。仍然没有解决缓存未命中的问题。
  • 使用 QTextLayout。同样的事情,缓存未命中会导致打嗝。

请提示我值得进一步探索的方向。谢谢!

PS 我在 Windows 10 上使用 Qt 5.15。

c++ performance qt text-rendering qwidget

7
推荐指数
0
解决办法
141
查看次数