我想知道有什么区别之间typeid以及typeof在C++中.这就是我所知道的:
typeid在type_info的文档中提到, 它在C++头文件typeinfo中定义.
typeof在C的GCC扩展和C++ Boost库中定义.
此外,这里是我创建的测试代码测试,我发现typeid它不会返回我的预期.为什么?
main.cpp中
#include <iostream>
#include <typeinfo> //for 'typeid' to work
class Person {
public:
// ... Person members ...
virtual ~Person() {}
};
class Employee : public Person {
// ... Employee members ...
};
int main () {
Person person;
Employee employee;
Person *ptr = &employee;
int t = 3;
std::cout << typeid(t).name() << std::endl;
std::cout << typeid(person).name() << std::endl; // …Run Code Online (Sandbox Code Playgroud) 这是我作为一个经验不足的程序员经常遇到的情况,我特别想知道我正在努力优化的一个雄心勃勃,速度密集的项目.对于主要的类C语言(C,objC,C++,Java,C#等)及其常用的编译器,这两个函数是否同样有效运行?编译代码有什么区别吗?
void foo1(bool flag)
{
if (flag)
{
//Do stuff
return;
}
//Do different stuff
}
void foo2(bool flag)
{
if (flag)
{
//Do stuff
}
else
{
//Do different stuff
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,是否有提前break或return早期的直接效率奖金/罚款?堆栈框架是如何涉及的?是否有优化的特殊情况?是否有任何因素(如内联或"Do stuff"的大小)可能会对此产生重大影响?
我总是支持改进可读性而非次要优化(我通过参数验证看到foo1很多),但这种情况经常发生,我想一劳永逸地抛开所有的担忧.
而且我知道过早优化的陷阱......呃,这些都是一些痛苦的回忆.
编辑:我接受了答案,但EJP的答案非常简洁地解释了为什么使用a return几乎可以忽略不计(在汇编中,return在函数末尾创建一个'分支',这非常快.分支改变了PC寄存器和也可能会影响缓存和管道,这是非常小的.)特别是对于这种情况,它实际上没有区别,因为它们if/else和return函数末尾都创建了相同的分支.
我怎么运行这个main.cpp:
#include <iostream>
#include <typeinfo>
using namespace std;
struct Blah {};
int main() {
cout << typeid(Blah).name() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过使用GCC 4.4.4版进行编译:
g++ main.cpp
Run Code Online (Sandbox Code Playgroud)
我明白了:
4Blah
Run Code Online (Sandbox Code Playgroud)
在Visual C++ 2008上,我会得到:
struct Blah
Run Code Online (Sandbox Code Playgroud)
有没有办法让它只是打印Blah或struct Blah?
让我们说我们有一个类层次结构.在底部我们有Base和顶部Derived.如何确定对象类,即使它被转换为基类指针.
Base* b = new Derived():
typeid(b).name(); // i want this to tell me that this is actually derived not base object
Run Code Online (Sandbox Code Playgroud)
有什么方法除了手动实现字符串字段或这样的虚拟get函数?
PS:我在谈论与编译器无关的解决方案
可能重复:
在C++中查找对象的类型
您好,
我很抱歉,如果它是重复但我无法在这里找到我的问题的答案.
假设我们在c ++中有以下类结构:
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
};
class CRectangle: public CPolygon {
public:
int area ()
{ return (width * height); }
};
Run Code Online (Sandbox Code Playgroud)
现在我有一个指向CPolygon对象的指针.如何检查它是否实际上是指向类CRectangle对象的指针?
可能重复:
在C++中查找对象的类型
我有一个问题,检查指针,看看它们是否符合特定的派生类,并采取必要的行动.
可以说我目前有2个派生类DerivedClass1和DerivedClass2基类BaseClass.我想检查以下操作.
Ptr<BaseClass> ptr;
if (ptr points to DerivedClass1)
{
action1
}
else
{
action2
}
如何检查特定DerivedClass的ptr点?
假设我已经class SuperClass { public: int a; }和class SubClass : SuperClass { public: int b; }我一起指向SubClass的一个实例,SubClass *subPointer并将该指针指向SuperClass指针SuperClass *superPointer = subPointer.当然,我总是可以将superPointer对象强制转换为SubClass的指针,因为它存储的唯一内容是地址.但是我如何知道对象superPointer是指向SubClass的实例还是只是一个SuperClass指针?
我试图找出VisualHint.SmartPropertyGrid.PropertyGrid是否满足我设置属性的需要,我的一些属性是布尔值.
其中一个参数是
// container:
// The instance of an object containing the C# property displayed in this new
// property.
Run Code Online (Sandbox Code Playgroud)
所以一般来说,我可以把它交给一个合适的对象 - 但是,布尔值是值类型,而不是对象.
在C#中,正确的语法是输入容器typeof(bool).有没有明智的方法在C++中做到这一点,还是我必须制作自己的bool对象?
我想创建一个优先级队列类,我可以在不同的程序中一次又一次地重复使用,它只存储一个类型/类.
我可以通过使用compareTo方法阻止任何其他类型/类进入队列,但这意味着队列类应该在进入队列的所有类型/类中都需要compareTo方法.
我知道在Java中,您可以使类实现Comparable以确保该类实现compareTo方法.所以我想知道c ++中是否有类似的东西.
同样,我不能使用模板,所以,任何替代品将不胜感激.模板不受限制的原因我也不知道,要求这个程序的人不会对此有所了解.它也必须纯粹是我自己的优先级队列代码.
如果我A在C++中有一个指向基类的指针,我怎么能在代码中告诉指针是派生类B还是C?