在文档中,我可以看到std::vector<bool>通过使每个布尔占据一个位来优化空间效率.从文档:
std :: vector的空间效率(以及它是否完全优化)是实现定义的方式.
这是否意味着它取决于编译器的实现?如果是,我在哪里可以检查我的编译器是否支持它?他们为什么不希望它得到支持?这似乎是一个非常简单而有效的实现.
如果没有,它意味着什么,如果我希望进行这种优化,它意味着什么?
我正在使用TDM GCC工具集.
编译器:TDM-GCC-5.1.0(SJLJ展开)
我一直在玩declval,我注意到我无法在它应该工作的环境中使用它:作为参数typeid().
在下面的代码中,我将其declval用于其中一个主要用例:获取方法的返回类型而不通过实例.我得到的错误是static_assert消息declval,但这应该是不可能的,因为typeid()在这种情况下不评估它的参数:
#include <typeinfo>
#include <utility>
struct Foo
{
int func();
};
int main()
{
typeid(std::declval<Foo>().func());
}
Run Code Online (Sandbox Code Playgroud)
这不能为我编译(编译时-std=c++14).我唯一的猜测是,我发现了一个编译器错误,或者我做了一些明显错误的事情,我看不到它.如果是后者,我道歉.
编辑:感谢ildjarn帮助我,解决方案是使用decltype,所以最后一行代码变为:
typeid(decltype(std::declval<Foo>().func()));
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,现在我的问题变成了:怎么样?这两个typeid()和decltype()是未评估的背景,所以我不知道有什么区别.
我正在查看 SO post C++ file stream open patterns ambiguity。我想知道fstream的默认文件打开模式。其中一个回答说,
以上暗示的是,以下代码使用完全相同的打开标志 fstream f("a.txt", ios_base::in | ios_base::out); 打开文件。ifstream g("a.txt", ios_base::out); ofstream h("a.txt", ios_base::in);
所以如果我理解正确的话,如果我创建 fstream 的对象,我应该能够读或写。
但下面的代码不会将任何数据写入文件
fstream testFile1;
testFile1.open("text1.txt");
testFile1<<"Writing data to file";
testFile1.close();
Run Code Online (Sandbox Code Playgroud)
但是,如下所示的添加模式会创建带有数据“将数据写入文件”的文本文件
testFile1.open("text1.txt", ios::out);
Run Code Online (Sandbox Code Playgroud)
那么默认模式是否是实现定义的?我正在使用 TDM-GCC-64 工具链。
我试图在Windows中测试TDM-GCC 64位汇编中的附加功能.我在前一段时间搜索了资源,我遇到了类似的代码(我做了一些修改,在TDM-GCC中编译它).
typedef struct
{
int size;
__uint64_t uints[130];
} BigInteger;
void add(BigInteger *X, BigInteger *Y); // X += Y
// %rcx holds address of X, and %rdx holds address of Y apparently.
// calc.s - assembly file
.globl add
add:
movq 8(%rdx), %rax
addq %rax, 8(%rcx)
movq 16(%rdx), %rax
adcq %rax, 16(%rcx)
movq 24(%rdx), %rax
adcq %rax, 24(%rcx)
... ...
Run Code Online (Sandbox Code Playgroud)
第一个汇编代码有效.不利的是,只要计算最大尺寸就需要很小的数字.所以我改为检查X和Y的大小并设置一个大小条件的循环,这样如果X和Y不大,它就不会总是添加整个数组.
...
// %r13 holds X addr, %r14 holds Y addr.
addq $8, %r13 // I have tried incq …Run Code Online (Sandbox Code Playgroud)