我对以下代码有一个奇怪的情况.请帮我澄清一下.
class B
{
public:
B();
virtual void print(int data=10)
{
cout << endl << "B--data=" << data;
}
};
class D:public B
{
public:
D();
void print(int data=20)
{
cout << endl << "D--data=" << data;
}
};
int main()
{
B *bp = new D();
bp->print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
关于我预期的输出
[ D--data=20 ]
Run Code Online (Sandbox Code Playgroud)
但实际上它是
[ D--data=10 ]
Run Code Online (Sandbox Code Playgroud)
请帮忙.这对你来说似乎很明显,但我不了解内部机制.
我正在寻找一个理想情况下具有以下功能的库:
我希望这是用C++编写的,因为我对这种语言最熟悉,但如果图书馆值得,我也会使用任何其他语言.我用Google搜索并发现了一些,但我没有时间尝试全部,所以我想听听其他人的经历.如果您对推荐的图书馆有一些经验,请回答.
PS:我也可以使用不同的库来进行聚类和SVM.
假设我有这样的函数:
def getNeighbors(vertex)
Run Code Online (Sandbox Code Playgroud)
它返回一个顶点列表,这些顶点是给定顶点的邻居.现在我想创建一个包含邻居所有邻居的列表.我这样做:
listOfNeighborsNeighbors = []
for neighborVertex in getNeighbors(vertex):
listOfNeighborsNeighbors.append(getNeighbors(neighborsVertex))
Run Code Online (Sandbox Code Playgroud)
是否有更多的pythonic方式来做到这一点?
缓存由缓存硬件透明地控制到处理器,因此如果我们在C程序中使用volatile变量,我的程序如何保证每次从指定的实际内存地址而不是缓存中读取数据.
我的理解是,
Volatile关键字告诉编译器不应优化变量引用,并应按代码中的编程读取.
缓存由缓存硬件透明地控制,因此当处理器发出地址时,它不知道数据是来自缓存还是来自内存.
因此,如果我需要每次都需要读取一个内存地址,我怎样才能确保它不是从缓存引用而是从所需的地址引用?
有些怎么样,这两个概念并不合适.请说明它是如何完成的.
(想象一下我们在缓存中有回写策略(如果需要分析问题))
谢谢你,Microkernel :)
c computer-science volatile computer-architecture memorycache
我有一段C代码调用程序集中定义的函数.举个例子,假设foo.c包含:
int bar(int x); /* returns 2x */
int main(int argc, char *argv[]) { return bar(7); }
Run Code Online (Sandbox Code Playgroud)
并且bar.s包含x86程序集中bar()的实现:
.global bar
bar: movl 4(%esp), %eax
addl %eax, %eax
ret
Run Code Online (Sandbox Code Playgroud)
在Linux上,我可以轻松地使用GCC编译和链接这些源,如下所示:
% gcc -o test foo.c bar.s
% ./test; echo $?
14
Run Code Online (Sandbox Code Playgroud)
在使用MinGW的Windows上,此操作失败并显示"未定义引用"栏'的错误.事实证明,在Windows上,所有具有C调用约定的函数标识符都以下划线为前缀,但由于"bar"在汇编中定义,因此它不会获得此前缀并且链接失败.(所以错误信息实际上是抱怨错过了符号_bar,而不是吧.)
总结一下:
% gcc -c foo.c bar.s
% nm foo.o bar.o
foo.o:
00000000 b .bss
00000000 d .data
00000000 t .text
U ___main
U _bar
00000000 T _main
bar.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T …Run Code Online (Sandbox Code Playgroud) 假设我有一个集合列表,我想获得该列表中所有集合的联合.有没有办法使用生成器表达式?换句话说,我怎么可以创建在所有集合的并集在该列表中直接作为frozenset?
我正在使用visual studio 2010,我正在尝试使用std :: copy_if,我想复制所有满足谓词的值.例如:
struct comp
{
bool operator()(const int i) { return i == 5 || i == 7; }
};
int main()
{
array<int, 10> arr = { 3, 2, 5, 7, 3, 5, 6, 7 };
vector<int> res;
copy_if(arr.begin(), arr.end(), res.begin(), comp());
for(int i = 0; i < res.size(); i++)
{
cout << res[i] << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我得到:向量迭代器不可递增.
在django中,如果我将模型中的字段设置为外键,"_id"则将其附加到该字段的名称.如何防止这种情况?
我的接口函数返回一个指向对象的指针.用户应该拥有该对象的所有权.我不想返回Boost.shared_ptr,因为我不想强制客户端使用boost.但是,在内部,我想将指针存储在shared_ptr中,以防止在异常等情况下发生内存泄漏.似乎无法从共享指针中分离指针.这里有什么想法?
我想知道我的构造者最好的形式.以下是一些示例代码:
class Y { ... }
class X
{
public:
X(const Y& y) : m_y(y) {} // (a)
X(Y y) : m_y(y) {} // (b)
X(Y&& y) : m_y(std::forward<Y>(y)) {} // (c)
Y m_y;
}
Y f() { return ... }
int main()
{
Y y = f();
X x1(y); // (1)
X x2(f()); // (2)
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是编译器在每种情况下都能做到的最好的.
(1a)y被复制到x1.m_y(1份)
(1b)将y复制到X的构造函数的参数中,然后复制到x1.m_y(2个副本)
(1c)y移入x1.m_y(1移动)
(2a)将f()的结果复制到x2.m_y(1份)
(2b)将f()构造成构造函数的参数,然后复制到x2.m_y(1个副本)
(2c)在堆栈上创建f(),然后移入x2.m_y(1 move)
现在几个问题:
在这两个方面,传递const引用并不差,有时候比传递值更好.这似乎违背了"想要速度?通过价值"的讨论..对于C++(不是C++ 0x),我应该坚持使用const引用作为这些构造函数,还是应该通过值传递?对于C++ 0x,我应该通过rvalue引用传递值吗?
对于(2),如果临时直接构造成x.m_y,我更喜欢.我认为即使是rvalue版本也需要一个移动,除非对象分配动态内存,否则移动与复制一样多.有没有办法对此进行编码,以便允许编译器避免这些副本和移动?
我已经在我认为编译器可以做得最好的事情和我自己的问题中做了很多假设.如果不正确,请更正其中任何一项.