Сборка "мусора" в C++ — почему?

Теперь это было хорошо мало загадки - большой вопрос!

Вот альтернатива решение Nicola Bonelli, которое не полагается на нестандартное typeof оператор.

, К сожалению, это не работает над GCC (MinGW) 3.4.5 или Цифровым Марсом 8.42n, но это действительно работает над всеми версиями MSVC (включая VC6) и на C++ Comeau.

более длительный блок комментария имеет детали о том, как он работает (или, как предполагается, работает). Как это говорит, я не уверен, какое поведение является совместимыми стандартами - я приветствовал бы комментарий относительно этого.

обновление - 7 ноября 2008:

Это похоже, в то время как этот код синтаксически корректен, поведение, что MSVC и шоу C++ Comeau не следуют стандарту (благодаря Leon Timmermans и litb для указания на меня в правильном направлении). C++ 03 стандарта говорит следующее:

14.6.2 Зависимых абзацев 3

[temp.dep]

имен В определении шаблона класса или члене шаблона класса, если базовый класс шаблона класса зависит от шаблонного параметра, объем базового класса не исследован во время неполного поиска имени или при определении шаблона класса или при участнике или во время инстанцирования шаблона класса или участника.

Так, похоже что, когда MSVC или Comeau рассматривают toString() функция членства T работающий поиск имени на сайте вызова в doToString(), когда шаблон инстанцируют, который является неправильным (даже при том, что это - на самом деле поведение, которое я искал в этом случае).

поведение GCC и Цифрового Марса надеется быть корректным - в обоих случаях лицо, не являющееся членом какой-либо организации, toString(), функция связывается с вызовом.

Крысы - я думал, что, возможно, нашел умное решение, вместо этого я раскрыл пару ошибок компилятора...

#include 
#include 

struct Hello
{
    std::string toString() {
        return "Hello";
    }
};

struct Generic {};


// the following namespace keeps the toString() method out of
//  most everything - except the other stuff in this
//  compilation unit

namespace {
    std::string toString()
    {
        return "toString not defined";
    }

    template 
    class optionalToStringImpl : public T
    {
    public:
        std::string doToString() {

            // in theory, the name lookup for this call to 
            //  toString() should find the toString() in 
            //  the base class T if one exists, but if one 
            //  doesn't exist in the base class, it'll 
            //  find the free toString() function in 
            //  the private namespace.
            //
            // This theory works for MSVC (all versions
            //  from VC6 to VC9) and Comeau C++, but
            //  does not work with MinGW 3.4.5 or 
            //  Digital Mars 8.42n
            //
            // I'm honestly not sure what the standard says 
            //  is the correct behavior here - it's sort 
            //  of like ADL (Argument Dependent Lookup - 
            //  also known as Koenig Lookup) but without
            //  arguments (except the implied "this" pointer)

            return toString();
        }
    };
}

template 
std::string optionalToString(T & obj)
{
    // ugly, hacky cast...
    optionalToStringImpl* temp = reinterpret_cast*>( &obj);

    return temp->doToString();
}



int
main(int argc, char *argv[])
{
    Hello helloObj;
    Generic genericObj;

    std::cout << optionalToString( helloObj) << std::endl;
    std::cout << optionalToString( genericObj) << std::endl;
    return 0;
}

46
задан coppro 23 October 2008 в 05:31
поделиться

1 ответ

Более простая потоковая безопасность и масштабируемость

Есть одно свойство GC, которое может быть очень важным в некоторых сценариях. Назначение указателя, естественно, атомарно на большинстве платформ, в то время как создание поточно-безопасных указателей с подсчетом ссылок («умных») довольно сложно и приводит к значительным накладным расходам на синхронизацию. В результате интеллектуальным указателям часто говорят, что они «плохо масштабируются» в многоядерной архитектуре.

5
ответ дан 26 November 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: