标签: tdm-gcc

std :: vector <bool>优化实现

文档中,我可以看到std::vector<bool>通过使每个布尔占据一个位来优化空间效率.从文档:

std :: vector的空间效率(以及它是否完全优化)是实现定义的方式.

这是否意味着它取决于编译器的实现?如果是,我在哪里可以检查我的编译器是否支持它?他们为什么不希望它得到支持?这似乎是一个非常简单而有效的实现.

如果没有,它意味着什么,如果我希望进行这种优化,它意味着什么?

我正在使用TDM GCC工具集.

c++ optimization boolean vector tdm-gcc

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

无法在typeid中使用declval用于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()是未评估的背景,所以我不知道有什么区别.

c++ typeid c++14 tdm-gcc

6
推荐指数
1
解决办法
175
查看次数

fstream 的默认模式

我正在查看 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 工具链。

c++ file-handling tdm-gcc

6
推荐指数
2
解决办法
5252
查看次数

汇编:增加2(或更大数字)而不破坏ADC循环中的CF?

我试图在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)

assembly x86-64 bigint extended-precision tdm-gcc

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