请考虑以下代码:
struct Base {};
struct Derived : public virtual Base {};
void f()
{
Base* b = new Derived;
Derived* d = static_cast<Derived*>(b);
}
Run Code Online (Sandbox Code Playgroud)
这是标准([n3290: 5.2.9/2])禁止的,因此代码无法编译,因为Derived 实际上是继承自的Base.virtual从继承中删除使代码有效.
这条规则存在的技术原因是什么?
我知道这是一个普遍的问题,但我想听听其他人对我们案件的看法:
我在一家小公司工作.我们的主要开发工具是PowerBuilder,这是一个非常有限的IDE,社区不断缩小.我们已经创建了一些工具,我们在内部使用这些工具来解决某些需求.它们既没有经过适当的设计也没有经过适当的测试,并且没有生产质量.OTOH,他们确实拯救了我们很长一段时间,也可以帮助别人.我敢肯定其他公司也有同样的工具,并且想知道与他人分享这些工具有多么普遍.照我看来 -
专业人士:
缺点:
您或您的公司是否曾经贡献过这样的工具,或者使用过其他人开发的工具?值得努力吗?
编辑:
对于那些多么奇怪的人,我想到的工具包括 -
根据我的理解,#pragma omp parallel它的变化基本上在许多并发线程中执行以下块,这对应于CPU的数量.当嵌套并行化时 - 并行为并行,并行函数内的并行函数等 - 内部并行化会发生什么?
我是OpenMP的新手,我想到的情况可能相当简单 - 将矢量与矩阵相乘.这是在两个嵌套的for循环中完成的.假设CPU的数量小于向量中的元素数量,那么尝试并行运行内部循环是否有任何好处?线程总数是否会大于CPU数量,还是内部循环会顺序执行?
std::atomic功能,诸如store和load采取一个std::memory_order参数.可以在运行时确定参数,就像任何其他函数参数一样.但是,实际值可能会影响编译期间代码的优化.考虑以下:
std::atomic<int> ai1, ai2;
int value = whatever;
void foo() {
std::memory_order memOrd = getMemoryOrder();
register int v = value; // load value from memory
ai1.store(v, memOrd); // dependency on v's value
ai2.store(1, memOrd); // no dependency. could this be move up?
}
Run Code Online (Sandbox Code Playgroud)
如果memOrd碰巧memory_order_relaxed,第二个商店可以安全地移动到第一个商店前面.这将在加载value和使用它之间增加一些额外的工作,这可能会阻止其他需要的停顿.但是,如果memOrd是memory_order_seq_cst,则不应该允许切换存储,因为如果设置为1 ai1,value则某些其他线程可能指望已经设置为ai2.
我想知道为什么内存顺序被定义为运行时参数而不是编译时间.在决定最佳内存操作语义之前,有人在运行时检查环境是否有任何理由?
假设我有一个包含数千个对象的数组,以及可能访问每个对象的少量线程.我想保护对其中一个对象方法的访问.最简单的方法是将该方法声明为synchronized.但是,这可能会导致创建数千个监视器,无论它们是以何种方式实现的.如果这是Win32,我永远不会创建数千个内核对象,如Mutex,但CRITICAL_SECTION 可能是合理的.我想知道Java的情况如何.鉴于争用的可能性很低,监视器的使用是否会超过他们所需的大量内存?在Java中使用这种低粒度同步的做法有多常见?
(显然有一些解决方法,例如使用更小的同步对象数组,可以使用一些哈希来访问.我不是在寻找一个实用的解决方案,我正在寻找一个洞察力).
经过一些演示,我遇到了以下声明:当JVM加载一个类时,它可以分析其内容并确保操作数堆栈没有溢出或下溢.我发现很多来源都提出了相同的主张,但没有说明它是如何完成的.
我不清楚如何使用静态分析进行此类验证.假设我有一个(恶意)方法,它可以获得一些值作为参数,并使用它来执行一系列弹出.在加载时,迭代次数是未知的,因为它取决于方法调用者给出的参数.因此,在我看来,只有在运行时才能确定是否会出现下溢.我在这里错过了什么?
我偶尔会使用WinDBG来分析生产环境中无法安装VS的问题.毫无疑问,这是一个非常强大的工具,但使用它有点烦人.即使产品经常更新,其GUI也会回到Win95天左右,因此其可用性也是如此.必须以我想要的方式对待GUI来布局窗口,并且必须记住所有这些文本命令,这对于现代桌面应用程序而言是非常低的标准.
AFAIK,WinDBG几乎建立在CDB之上,CDB是一个命令行调试器.因此,构建一个现代的GUI包装器来取代现有的恐龙并不难.有没有人这样做过?我是唯一对WinDBG有这种复杂感情的人吗?
(顺便说一句,我知道我可以创建一个转储并将其带回到我拥有VS的地方,但我有时必须调试64位进程,而且我没有64位开发机器.可悲,但是真的)
我们制作了一个内容管理系统.它是一个基于数据库的系统,仅供企业和组织使用,不能从Internet下载.也就是说,它不是某种人可能偶然发现的软件,不知道它是什么以及它是否安全.在20多年的时间里,我们的系统正在销售,其可执行文件从未经过数字签名.是时候开始签名吗?
对于初学者,我可以想到一些优点和缺点:
我遇到了一些我不清楚的异常问题.在C++中,当抛出一个对象时,它首先被复制到一个临时对象,然后临时对象被传递给捕获代码.该副本涉及使用对象的类复制构造函数.AFAIK,这意味着如果一个类有一个私有拷贝构造函数,它就不能用作异常.但是,在VS2010中,以下代码编译并运行:
class Except
{
Except(const Except& other) { i = 2; }
public:
int i;
Except() : i(1) {}
};
int main()
{
try
{
Except ex1;
throw ex1; // private copy constructor is invoked
}
catch (Except& ex2)
{
assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这合法吗?
c++ ×5
java ×2
atomic ×1
boost ×1
c++11 ×1
code-signing ×1
debugging ×1
downcast ×1
exception ×1
executable ×1
jvm ×1
memory-model ×1
monitor ×1
nested ×1
open-source ×1
openmp ×1
performance ×1
powerbuilder ×1
private ×1
static-cast ×1
verification ×1
windbg ×1