Проверка эрудиции
От: Snax Россия  
Дата: 23.04.02 08:37
Оценка: 12 (2)
Если Вы устали от оффтопиков, вот Вам простенькая задача:
Имеется шаблонная функция шаблонного класса:

template <T>
class A
{
public:
  template<I>
  void Func(I *pArg)
  {
  }
};


Незамысловатый компилятор от Майкрософт
скомпиляет такую функцию, только если она реализована
в декларации класса.
Задача. Необходимо убедить компилятор, что такую
функцию не нужно подставлять inline.

Варианты?
Re: Проверка эрудиции
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 23.04.02 08:47
Оценка:
Здравствуйте Snax, Вы писали:

S>Варианты?


С точностью до перевода этого места в документации
"Pragma auto_inline does not apply to explicit inline functions."
#pragma auto_inline( on | off )
Алексей Кирдин
Re: Проверка эрудиции
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 23.04.02 09:00
Оценка: 12 (1)
Здравствуйте Snax, Вы писали:

S>Варианты?

_forceinline — поиск в MSDN. Там есть список случаев, когда компилятор не должен делать функцию inline. Например, различная стратегия обработки исключений, переменное число аргументов...
Алексей Кирдин
Re: Проверка эрудиции
От: Павел Кузнецов  
Дата: 23.04.02 09:07
Оценка: 4 (1)
Здравствуйте Snax, Вы писали:

S>(...) Необходимо убедить компилятор, что такую функцию не нужно подставлять inline.


Если версия 7.0 (aka .net), то можно так:
template <T>
class A
{
public:
  template<I>
  __declspec(noinline) void Func(I *pArg)
  {
  }
};
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Проверка эрудиции
От: Snax Россия  
Дата: 23.04.02 09:34
Оценка:
Здравствуйте Kaa, Вы писали:
Kaa>#pragma auto_inline( on | off )

Эта прагма полезна, если нужно превратить
в inline функцию, не объявленную таковой.

Поскольку все функции, реализованные в декларации класса
являются inline, никакого эффекта в данном случае
от этой прагмы не будет.

Пока холодно.

Павел.
Re[2]: Проверка эрудиции
От: Snax Россия  
Дата: 23.04.02 09:48
Оценка:
Здравствуйте Kaa, Вы писали:
Kaa>Например, различная стратегия обработки исключений, переменное число аргументов...

Это правда. Оба способа имеют небольшие недостатки, но ответ правильный.
Интересно, что компилятор генерит одинаковый код для таких вот случаев:

template<class I>
void Test(I *pPtr)
{
    try
    {
        *pPtr = sizeof(T) * ::GetTickCount();
    }
    catch(...)
    {
    }
}

template<class I>
void Test2(I *pPtr,...)
{
    *pPtr = sizeof(T) * ::GetTickCount();
}


Павел.
Re: Проверка эрудиции
От: adontz Грузия http://adontz.wordpress.com/
Дата: 23.04.02 11:24
Оценка:
Здравствуйте Snax, Вы писали:

S>Если Вы устали от оффтопиков, вот Вам простенькая задача:

S>Имеется шаблонная функция шаблонного класса:

S>
S>template <T>
S>class A
S>{
S>public:
S>  template<I>
S>  void Func(I *pArg)
S>  {
S>  }
S>};

S>


S>Незамысловатый компилятор от Майкрософт

S>скомпиляет такую функцию, только если она реализована
S>в декларации класса.
S>Задача. Необходимо убедить компилятор, что такую
S>функцию не нужно подставлять inline.

S>Варианты?


Нет вариантов кроме как запретить inline Как таковой
Функция-метод с реализацией в описании класса это inline функция
Более того. Это один из способов делать методы inline
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Проверка эрудиции
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 23.04.02 11:35
Оценка:
Здравствуйте adontz, Вы писали:

A>Нет вариантов кроме как ...

Пардон, но мы тут не о стандарте говорим, а о конкретном компиляторе, чье поведение в данной ситуации описано. Способы есть
Алексей Кирдин
Re: Проверка эрудиции
От: Вале РА Австралия  
Дата: 23.04.02 13:22
Оценка: -1
S>Если Вы устали от оффтопиков, вот Вам простенькая задача:
S>Имеется шаблонная функция шаблонного класса:

S>
S>template <T>
S>class A
S>{
S>public:
S>  template<I>
S>  void Func(I *pArg)
S>  {
S>  }
S>};

S>


S>Незамысловатый компилятор от Майкрософт

S>скомпиляет такую функцию, только если она реализована
S>в декларации класса.
S>Задача. Необходимо убедить компилятор, что такую
S>функцию не нужно подставлять inline.

S>Варианты?


А чем тебе не подходит такой вариант?



template <T>
class A
{
public:
  template<I>
  void Func(I *pArg);
};


template<I>
A::Func (I *pArg)
{
}
В этом нет ничего сложного. Просто нужно нажимать нужные клавиши в нужное время! (с) И.С. Бах
Re[2]: Проверка эрудиции
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 23.04.02 14:11
Оценка:
Здравствуйте Вале РА, Вы писали:

ВР>А чем тебе не подходит такой вариант?


Это дело не откомпилится в VC6. Такие функции должны быть определены в теле объемлющего объявления класса-шаблона.
Алексей Кирдин
Re[3]: Проверка эрудиции
От: Вале РА Австралия  
Дата: 24.04.02 04:34
Оценка:
Kaa>Это дело не откомпилится в VC6. Такие функции должны быть определены в теле объемлющего объявления класса-шаблона.

Ой! Прошу прощения, я проглядел второй template. Беру свои слова обратно
В этом нет ничего сложного. Просто нужно нажимать нужные клавиши в нужное время! (с) И.С. Бах
Re: Проверка эрудиции
От: __Andrey__  
Дата: 25.04.02 14:40
Оценка:
Здравствуйте Snax, Вы писали:

S>Если Вы устали от оффтопиков, вот Вам простенькая задача:

S>Имеется шаблонная функция шаблонного класса:

S>
S>template <T>
S>class A
S>{
S>public:
S>  template<I>
S>  void Func(I *pArg)
S>  {
S>  }
S>};

S>


S>Незамысловатый компилятор от Майкрософт

S>скомпиляет такую функцию, только если она реализована
S>в декларации класса.
S>Задача. Необходимо убедить компилятор, что такую
S>функцию не нужно подставлять inline.

S>Варианты?




Я в работе не проверил но скомпилировалось и все такие дела:

template <class T> class A
{
public:
template<class I> void Func(I *pArg);
};

template <class T>
template<class I>
void A<T>::Func(I *pArg)
{
//...
}
Re: Проверка эрудиции
От: KA it-knowledge-base.blogspot.com
Дата: 25.04.02 15:57
Оценка:
Здравствуйте Snax, Вы писали:

S>Если Вы устали от оффтопиков, вот Вам простенькая задача:

S>Имеется шаблонная функция шаблонного класса:

S>
S>template <T>
S>class A
S>{
S>public:
S>  template<I>
S>  void Func(I *pArg)
S>  {
S>  }
S>};

S>


S>Незамысловатый компилятор от Майкрософт

S>скомпиляет такую функцию, только если она реализована
S>в декларации класса.
S>Задача. Необходимо убедить компилятор, что такую
S>функцию не нужно подставлять inline.

S>Варианты?


Есть идея! Необходимо как-то использовать адрес функции Func. IMHO тогда компилер не посмеет сделать ее inline.
Например, написать другую шаблонную функцию (метод), которая и будет возвращать этот адрес. Если в шаблоне A это нельзя сделать, то можно и другой шаблон создать.
Это пока все, на конкретный код у меня эрудиции сегодня не хватает
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re[2]: Проверка эрудиции
От: Snax Россия  
Дата: 25.04.02 23:37
Оценка:
Здравствуйте KA, Вы писали:

KA>Есть идея! Необходимо как-то использовать адрес функции Func. IMHO тогда компилер не посмеет сделать ее inline.


Бабушка надвое сказала. Компилятор может ее продублировать.
Т.е. и отдельно положить, и в другую функцию вставить.
Так он ведет себя если виртуальную функцию определить
в декларации класса. И подставляет, если знает, что делает
, и отдельно кладет, чтобы через vtbl вызыватьможно было.

Павел.
Re[2]: Проверка эрудиции
От: Snax Россия  
Дата: 25.04.02 23:46
Оценка:
Здравствуйте __Andrey__, Вы писали:

A>Я в работе не проверил но скомпилировалось и все такие дела:


A>template <class T> class A
A>{
A>public:
A>   template<class I> void Func(I *pArg);
A>};

A>template <class T>
A>    template<class I>
A>        void A<T>::Func(I *pArg)
A>        {
A>           //...
A>        }


А будет ли это компиляться, если дописать

int main()
{
  A<int> test;
  long n;
  test.func(&n);

  return 0;
}


Понимаешь, компилятор способен скомпилировать
функции шаблонного класса/функции только тогда, кода ему
заданы все типы, используемые шаблоном.

Павел.
Re: Проверка эрудиции
От: Roman Fadeyev  
Дата: 29.04.02 08:15
Оценка:
Здравствуйте Snax, Вы писали:

S>Если Вы устали от оффтопиков, вот Вам простенькая задача:

S>Имеется шаблонная функция шаблонного класса:

S>
S>template <T>
S>class A
S>{
S>public:
S>  template<I>
S>  void Func(I *pArg)
S>  {
S>  }
S>};

S>


S>Незамысловатый компилятор от Майкрософт

S>скомпиляет такую функцию, только если она реализована
S>в декларации класса.
S>Задача. Необходимо убедить компилятор, что такую
S>функцию не нужно подставлять inline.

S>Варианты?

Я тоже хотел это узнать в http://www.rsdn.ru/forum/?gid=9&amp;mid=17637&amp;tid=17558
Автор: Brother
Дата: 17.12.01
. К сожалению, ничего не вышло
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.