小编Aar*_*pel的帖子

C++:从类继承是否会将其带入命名空间?

这是一些人为的示例代码:

template<typename T> void Do(T arg) { (void)arg->b; }

namespace A {
    struct Foo { int a; };
}

namespace B {
    struct Foo { int b; };
    struct Bar : A::Foo {
        void Blah() { Do((Foo *)0); }
    };
}
Run Code Online (Sandbox Code Playgroud)

哪个用gcc 4.8.2编译时(clang给出了类似的错误):

namespacebug.cpp: In instantiation of ‘void Do(T) [with T = A::Foo*]’:
namespacebug.cpp:10:34:   required from here
namespacebug.cpp:1:39: error: ‘struct A::Foo’ has no member named ‘b’
 template<typename T> void Do(T arg) { (void)arg->b; }
                                       ^
Run Code Online (Sandbox Code Playgroud)

请注意,它引用的错误T = A::Foo即使在调用站点我正在创建一个 …

c++ namespaces

7
推荐指数
1
解决办法
171
查看次数

在64位系统上以低地址分配内存的最可靠/可移植方式是什么?

我需要分配大块内存(由我的自定义分配器使用),它们位于虚拟地址空间的前32GB内.

我想如果我需要,比方说,1MB块,我可以从低地址开始使用mmapMAP_FIXED_NOREPLACE(或VirtualAlloc)以1MB的增量进行迭代,直到调用成功.从最后一个成功的块继续下一个.

这听起来很笨拙,但至少它会对OS地址空间布局的变化和ASLR算法的变化有所增强.根据我对当前操作系统布局的理解,前32GB应该有足够的内存,但是我可能会遗漏一些东西?

Windows,Linux,OS X,iOS或Android中有什么东西会破坏这个方案吗?有没有更好的办法?

如果您想知道,这是为了实现编程语言的VM,在64位系统上将所有指针拟合为32位值可以提供巨大的内存使用优势甚至速度增益.由于所有对象至少为8字节对齐,因此较低的3位可以移出,将指针范围从4GB扩展到32GB.

c++ operating-system memory-management mmap vm-implementation

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