在C++中编写一个以超时作为其参数之一的函数时,我应该使用什么类型的超时参数本身?
这种功能的一个例子可能是:
void my_function(bool work_really_hard, timeout_type timeout)
{
// Do stuff, until timeout is reached.
}
Run Code Online (Sandbox Code Playgroud)
我曾考虑过使用std::chrono::secondsfor timeout_type,但是不允许在sub-second领域使用任何超时.
std::chrono::nanoseconds相反,使用时,指定10分钟是很麻烦的.
有什么办法以合理的方式解决这个问题,同时保持功能签名和调用整洁简单?
C++标准是否保证(通过明确说明或通过逻辑推导隐式)std::uintmax_t可以保存所有值std::size_t?
或者是否可能std::numeric_limits<std::size_t>::max()大于std::numeric_limits<std::uintmax_t>::max()?
维基百科将缩小定义为......
[...]从源代码中删除所有不必要的字符而不更改其功能的过程.这些不必要的字符通常包括空格字符,换行符,注释,有时还有块分隔符,它们用于为代码添加可读性,但不需要执行.
目前,我正在这样做是为了我的HTML,CSS和Javascript,以节省带宽,但有人告诉我说,他记得有一个浏览器行为异常时,有一定的标签(即之间没有空格ul和li项目).这是真的?
是否有任何值得注意的浏览器,代理或其他用户代理在处理缩小代码时行为不当?
除了在查看源代码时失去可读性之外,缩小还有其他任何缺点吗?
互联网上有几篇帖子暗示你应该使用std::vector<unsigned char>或类似的二进制数据.
但我更倾向于使用std::basic_string变体,因为它提供了许多方便的字符串操作功能.和AFAIK一样,自C++ 11以来,该标准保证了每个已知的C++ 03实现已经完成的工作:std::basic_string将其内容连续存储在内存中.
乍一看,std::basic_string<unsigned char>可能是一个不错的选择.
std::basic_string<unsigned char>但是,我不想使用,因为几乎所有操作系统函数都只接受char*,因此需要进行显式转换.此外,字符串文字是const char*,所以const unsigned char*每次我将字符串文字分配给我的二进制字符串时,我都需要显式强制转换,我也想避免.此外,用于读取和写入文件或网络缓冲区的函数同样接受char*和const char*指针.
这离开了std::string,这基本上是一个typedef std::basic_string<char>.
使用std::string二进制数据的唯一潜在剩余问题(我可以看到)是std::string使用char(可以签名).
char,signed char和,unsigned char是三种不同的类型,char可以是未签名或签名.
因此,当11111111b从std::string:operator[]char 返回实际字节值,并且您想要检查其值时,其值可以是255(如果char是无符号的),也可能是"负面的"(如果char已签名,则取决于您的数字表示).
类似地,如果要将实际字节值显式附加11111111b到a std::string,则只需附加(char) (255)可能是实现定义的(甚至引发信号),如果char已签名且intto char会话导致溢出. …
我们假设我有一个项目表:
CREATE TABLE items
(
item serial PRIMARY KEY,
...
);
Run Code Online (Sandbox Code Playgroud)
现在我想为每个项目引入"权限"的概念(注意,我不是在谈论数据库访问权限,而是在谈论该项目的业务逻辑权限).每个项目都具有默认权限以及可能覆盖默认权限的每用户权限.
我试着想办法实现这个,并想出了以下解决方案:
对每个权限使用布尔列:
CREATE TABLE items
(
item serial PRIMARY KEY,
can_change_description boolean NOT NULL,
can_change_price boolean NOT NULL,
can_delete_item_from_store boolean NOT NULL,
...
);
CREATE TABLE item_per_user_permissions
(
item int NOT NULL REFERENCES items(item),
user int NOT NULL REFERENCES users(user),
PRIMARY KEY(item, user),
can_change_description boolean NOT NULL,
can_change_price boolean NOT NULL,
can_delete_item_from_store boolean NOT NULL,
...
);
Run Code Online (Sandbox Code Playgroud)
优点:每个权限都被命名.
缺点:有许多权限会显着增加列数,您必须定义两次(每个表一次).
使用整数并将其视为位域(即位0用于can_change_description,位1用于 …
std::basic_string具有以下构造函数,该构造函数使用以下指向的以null结尾的字符串的内容初始化字符串s:
std::basic_string(const CharT* s, const Allocator& alloc = Allocator());
Run Code Online (Sandbox Code Playgroud)
但是构造函数如何事先知道为其内部缓冲区中的字符串保留多少空间?
我可以想到两种方法:
1)它可以首先遍历整个以null结尾的字符串,直到它找到第一个NULL字符,记住它遍历了多少个字符,并将其用作其内部缓冲区的容量并开始复制.
缺点:它必须读取字符串两次,一次用于计算字符,第二次用于复制字符串.
2)它可以在其内部缓冲区中保留一个保守的数量,然后开始复制.如果它击中NULL字符缓冲区用完之前,我们就好了,否则我们需要(一个保守量再次)预留更多的空间,然后重复上述步骤.
缺点:如果字符串相当大,不断重新调整容量的开销可能会变得明显.
那么,理智的std :: basic_string实现做了什么(或者甚至在标准中指定了什么)?
c++ ×4
c++11 ×4
stdstring ×2
c++-chrono ×1
css ×1
html ×1
javascript ×1
minify ×1
permissions ×1
postgresql ×1
sql ×1
web ×1