سؤال

اندريه ألكساندريسكو يكتب في <لأ href = "http://books.google.com/books؟id= aJ1av7UFBPwC وخريج = PA38 وDQ = typeid + type_info + عمر # ت = onepage وف = typeid٪ 20type_info٪ 20lifetime وو = كاذبة "يختلط =" noreferrer "> تصميم ++ C الحديثة :

<اقتباس فقرة>   

والكائنات التي يتم إرجاعها بواسطة typeid لها   تخزين ثابت، لذلك لم يكن لديك ل   قلق حول قضايا الحياة.

واندريه قائلا:

<اقتباس فقرة>   

وهذا المعيار لا يضمن أن   كل استدعاء، ويقول، typeid(int)   إرجاع إشارة إلى نفسه   الكائن type_info.

وعلى الرغم من أن المعيار لا يضمن هذا، وكيف يتم هذا تنفيذها في المجمعين المشتركة، مثل دول مجلس التعاون الخليجي و Visual Studio؟

وعلى افتراض typeid لا تسرب (والعودة مثيل جديد كل مكالمة)، هل هو واحد "الجدول" في التطبيق، لكل وحدة الترجمة، في دلل / نحو ذلك، أو شيء مختلف تماما؟

هل هناك أوقات عندما &typeid(T) != &typeid(T)؟

وأنا مهتم بشكل رئيسي في المجمعين ويندوز، ولكن هو موضع تقدير أي معلومات لينكس ومنصات أخرى أيضا.

هل كانت مفيدة؟

المحلول

<اقتباس فقرة>   

هل هناك أوقات عندما وtypeid (T)! = & typeid (T)؟

     

وأنا مهتم بشكل رئيسي في المجمعين ويندوز، ولكن هو موضع تقدير أي معلومات لينكس ومنصات أخرى أيضا.

نعم. تحت النوافذ DLL لا يمكن أن يكون حرف التي لم تحل بعد، وبالتالي. إذا كان لديك:

وfoo.h

struct foo { virtual ~foo() {} };

وdll.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

وMAIN.CPP

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

هل تعطيك مؤشرات مختلفة. لأنه قبل دلل تم تحميل typeid (فو) يجب أن تكون موجودة في كل من إكس DLL والأساسي

وأكثر بعد ذلك، لينكس، إذا لم يكن الملف التنفيذي المترجمة الرئيسي مع -rdynamic (أو --export ديناميكية) ثم typeid ستحل على رموز مختلفة في تنفيذ و في وجوه المشتركة (والتي عادة لا يحدث تحت منصات ELF) بسبب بعض التحسينات القيام به عندما ربط تنفيذ - إزالة الرموز غير الضرورية

نصائح أخرى

ومعايير ترك أحيانا سلوك معين غير محدد من أجل إعطاء تطبيقات بعض الحرية. في هذه الحالة، كيف تدار TypeIDs يتم ترك متابعة تنفيذ مترجم وكنت مجرد الحصول على مجموعة من القواعد (أساسا: لا تشغل نفسك مع الكيفية التي يتم بها تخصيص الذاكرة لهذا)

.

هل هناك أي سبب معين لماذا عليك أن تكون قادرا على مقارنة TypeIds استنادا إلى عنوان ذاكرتهم؟ TypeIds تجاوز بالفعل == و! = من أجل توفير لكم مع القدرة على المقارنة بينها، وتوفير اسم () التي يمكن أن تستخدم لتحديد وضعهم بشكل فريد.

إذا كنت قد حصلت على C ++ لغة برمجة (بيارن ستروستروب) متوفرة، الفصل 15 لديه الكثير من التفاصيل حول معالجة الهرمية الطبقة. ربما قد تجد حل آخر هناك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top