klen 1 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба 2_'Genadi Zawidowski хорошо, соберу для масдая. похоже OXYCOCCUS не та что я имел ввиду, после обеда пресс-конфенция :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба Не, libm указана явно (ключил -lm компилятору): Ну тогда либо у Вас в libm нет sinf/cosf (что вряд ли), либо баг линкера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба Попытался на радостях использовать std::vector ... /opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h: In instantiation of 'void std::fill(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = long unsigned int*; _Tp = int]': /opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_bvector.h:402:55: required from here /opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h:729:37: error: '__glibcxx_requires_valid_range' was not declared in this scope __glibcxx_requires_valid_range(__first, __last); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ compilation terminated due to -Wfatal-errors. Безнадёга Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 сентября, 2016 Опубликовано 6 сентября, 2016 · Жалоба Попытался на радостях использовать std::vector ... /opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h: In instantiation of 'void std::fill(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = long unsigned int*; _Tp = int]': /opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_bvector.h:402:55: required from here /opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h:729:37: error: '__glibcxx_requires_valid_range' was not declared in this scope __glibcxx_requires_valid_range(__first, __last); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ compilation terminated due to -Wfatal-errors. Безнадёга безнадега это когда белые тапочки и деревянный макинтош! и то наукой не доказано что это не фазовый переход.... для линуха собрал проверил, для масдая оставил на сборку и побежад домой. если собралось выложу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 сентября, 2016 Опубликовано 6 сентября, 2016 (изменено) · Жалоба безнадега это когда белые тапочки и деревянный макинтош! и то наукой не доказано что это не фазовый переход.... для линуха собрал проверил, для масдая оставил на сборку и побежад домой. если собралось выложу. нужно пробовать! linux64 http://klen.org/Files/DevTools/x86_64-kgp-...05_VACCINIUM.7z win64 http://klen.org/Files/DevTools/x86_64-kgp-...06_VACCINIUM.7z с векторами сейчас проверю и отпишусь - у меня все работало. Изменено 6 сентября, 2016 пользователем IgorKossak грамматика Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 6 сентября, 2016 Опубликовано 6 сентября, 2016 (изменено) · Жалоба win64 - проект собрался, работает нормально. измерениями ускорения/замедляния оптимизации вычислений не занимался. 580184 байт кода против 572812 намекают, что должно стать шустрее. Изменено 6 сентября, 2016 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 сентября, 2016 Опубликовано 6 сентября, 2016 (изменено) · Жалоба win64 - проект собрался, работает нормально. измерениями ускорения/замедляния оптимизации вычислений не занимался. 580184 байт кода против 572812 намекают, что должно стать шустрее. по поводу C++14, проверил - мое работает. накидал примерчик проверяем работу стд вектора и некоторые фичи с++11/14 #include "console.h" #include "engine.h" #include "rt_counter.h" #include "vdt/vdtMath.h" #include <vector> TEngineTask* EngineTask ; typedef struct { float real ; float image ; } signal_t ; typedef std::vector<signal_t,KgpAllocator<signal_t>> signal_vec_t ; void TEngineTask::Code() { TickType_t xLastWakeTime = TTaskUtilities::GetTickCount(); signal_vec_t signal_vec ; signal_vec.resize( 32 ) ; // range-base циклы for(auto &element: signal_vec) { element = {0 , -1} ; } // энумерация по итераторам, вычисление индекса элемента и присваивание for( auto it = signal_vec.begin() ; it != signal_vec.end() ; it++ ) { auto pos = std::distance(signal_vec.begin(),it); signal_t tmp ; vdt::fast_sincosf( vdt::details::VDT_PI_F * pos / 32 , tmp.real , tmp.image) ; *it = tmp ; } while(1) { if( !active ) Suspend(); DelayUntil( &xLastWakeTime, 1000 ) ; for(auto &element: signal_vec) { rmsg("{%3.3 %1.3}\n", element.real , element.image ); } } } вывод в консольку: {000.000 1.000} {000.098 0.995} {000.195 0.980} {000.290 0.956} {000.382 0.923} {000.471 0.881} {000.555 0.831} {000.634 0.773} {000.707 0.707} {000.773 0.634} {000.831 0.555} {000.881 0.471} {000.923 0.382} {000.956 0.290} {000.980 0.195} {000.995 0.098} {001.000 -0.000} {000.995 -0.098} {000.980 -0.195} {000.956 -0.290} {000.923 -0.382} {000.881 -0.471} {000.831 -0.555} {000.773 -0.634} {000.707 -0.707} {000.634 -0.773} {000.555 -0.831} {000.471 -0.881} {000.382 -0.923} {000.290 -0.956} {000.195 -0.980} {000.098 -0.995} нужно сделать важный коментарий - если посмотреть повнимательней в мой код то Вы заметите что стандартный аллокатор по умолчанию я не использую - это злое зло для машин с терабайтами озу и терагерцами в процессорах. у меня свой легковесный аллокатор который я подсовываю STL, далее нужно сказать что это аллокатор НЕ использует стандартный new/delete - а использует мои враgеры lдля этих С++ операторов которые НЕ используют стандартные malloc/free - а используют мою обертку вокруг TLSF все эти танцы с бубном необходимы для обхода слежующих двух граблей 1. new и delete c танадартной реализации могут генерить эксепшены которыя мы выпиливаем - в микроэмбедет оно плохо ложится, поэтому свой врапер на эти операторы 2. malloc и free которые нужны для new и delete из newlib лично у меня вызывают печаль поэтому я их отправил к TLSF который линкуется во все мои проекты. но Вы не обязаны использовать ни враперы по типу моих ни вообще stdlibc для использования чистого C++14, но без STL теряется изящность - там много написано и писать заново свое корявое не интересно. тем немение использую контейнеры прийдется реализовать работу с памятью о чем выше сообщено. все эти мысои оформлены в виде нескольких мален7ьких хидеров - вот их реализация: supc++.h #ifndef __SUPC++_H__ #define __SUPC++_H__ // KGP tools embedded SDK // Chernov S.A. aka klen // [email protected] #include <stddef.h> // define size_t #include <bits/c++config.h> // nedded for _GLIBCXX_NOEXCEPT macro and c++ exception handler redefinition extern "C" void *malloc( size_t WantedSize ); extern "C" void free( void* pv ); // see referense of 'noexcept' in $TARGET/lib/gcc/$TARGET/X.X.X/include/c++/$TARGET/bits/c++config.h // _GLIBCXX_NOEXCEPT is macro wrap of noexcept //------------------------------------------------------------------ // определение функции оператор new inline void* operator new(size_t size) _GLIBCXX_NOEXCEPT { return malloc( size ); } //------------------------------------------------------------------ // определение функции оператор delete inline void operator delete(void* ptr) _GLIBCXX_NOEXCEPT { free(ptr); } inline void operator delete(void* ptr , size_t size) _GLIBCXX_NOEXCEPT { free(ptr); } //------------------------------------------------------------------ // определение функции оператор new[] inline void* operator new[] (size_t size) _GLIBCXX_NOEXCEPT { return malloc( size ); } //------------------------------------------------------------------ // определение функции оператор delete[] inline void operator delete[] (void* ptr) _GLIBCXX_NOEXCEPT { free(ptr); } inline void operator delete[] (void* ptr, size_t size) _GLIBCXX_NOEXCEPT { free(ptr); } //------------------------------------------------------------------ // default throw catchers __attribute__((__noreturn__)) inline void throw_exeption_catcher() { while(1) asm volatile("nop"); } __attribute__((__noreturn__)) inline void throw_exeption_catcher(const char* msg) { // save mgs addr to r0 for avoid GCC optimisation asm volatile ("ldr r0 , %[msg]" : : [msg]"m" (msg) : ); while(1) asm volatile("nop"); } __attribute__((__noreturn__)) inline void throw_exeption_catcher(int val) { // save mgs addr to r0 for avoid GCC optimisation asm volatile ("ldr r0 , %[val]" : : [val]"m" (val) : ); while(1) asm volatile("nop"); } // переопределение обработчиков исключений #include <bits/exception_defines.h> #define THROW_CATCHER_ARG(ret_t,name,arg_t,arg_v) __attribute__((__noreturn__)) inline ret_t name(arg_t arg_v) {throw_exeption_catcher(arg_v);} #define THROW_CATCHER_FMT(name) __attribute__((__noreturn__)) __attribute__((__format__(__printf__, 1, 2))) \ inline void name(const char* fmt, ...) {throw_exeption_catcher(fmt);} namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION THROW_CATCHER_ARG(void,__throw_bad_exception,void,) // Helper for exception objects in <except> THROW_CATCHER_ARG(void,__throw_bad_alloc,void,) // Helper for exception objects in <new> THROW_CATCHER_ARG(void,__throw_bad_cast,void,) // Helper for exception objects in <typeinfo> THROW_CATCHER_ARG(void,__throw_bad_typeid,void,) THROW_CATCHER_ARG(void,__throw_logic_error,const char*,msg) // Helpers for exception objects in <stdexcept> THROW_CATCHER_ARG(void,__throw_domain_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_invalid_argument,const char*,msg) THROW_CATCHER_ARG(void,__throw_length_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_out_of_range,const char*,msg) THROW_CATCHER_ARG(void,__throw_runtime_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_range_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_overflow_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_underflow_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_ios_failure,const char*,msg) // Helpers for exception objects in <ios> THROW_CATCHER_ARG(void,__throw_system_error,int,val) THROW_CATCHER_ARG(void,__throw_future_error,int,val) THROW_CATCHER_ARG(void,__throw_bad_function_call,void,) // Helpers for exception objects in <functional> THROW_CATCHER_FMT(__throw_out_of_range_fmt) _GLIBCXX_END_NAMESPACE_VERSION } // namespace namespace __gnu_cxx { _GLIBCXX_BEGIN_NAMESPACE_VERSION THROW_CATCHER_ARG(void,__verbose_terminate_handler,void,) _GLIBCXX_END_NAMESPACE_VERSION }; #endif /* __SUPC++_H__ */ supstl.h #ifndef __SUPSTL_H__ #define __SUPSTL_H__ // KGP tools embedded SDK // Chernov S.A. aka klen // [email protected] #include <limits> #include <algorithm> #include <cstring> extern "C" void* malloc( size_t ); extern "C" void free( void* ); namespace std { using std::size_t; using std::ptrdiff_t; /** * @brief An allocator that uses malloc. * @ingroup allocators * * This is precisely the allocator defined in the C++ Standard. * - all allocation calls malloc * - all deallocation calls free */ template<typename _Tp> class KgpAllocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* pointer; typedef const _Tp* const_pointer; typedef _Tp& reference; typedef const _Tp& const_reference; typedef _Tp value_type; template<typename _Tp1> struct rebind { typedef KgpAllocator<_Tp1> other; }; KgpAllocator() _GLIBCXX_USE_NOEXCEPT { } KgpAllocator(const KgpAllocator&) _GLIBCXX_USE_NOEXCEPT { } template<typename _Tp1> KgpAllocator(const KgpAllocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { } ~KgpAllocator() _GLIBCXX_USE_NOEXCEPT { } pointer address(reference __x) const _GLIBCXX_NOEXCEPT { return std::__addressof(__x); } const_pointer address(const_reference __x) const _GLIBCXX_NOEXCEPT { return std::__addressof(__x); } // NB: __n is permitted to be 0. The C++ standard says nothing // about what the return value is when __n == 0. pointer allocate(size_type __n, const void* = 0) { if (__n > this->max_size()) std::__throw_bad_alloc(); pointer __ret = static_cast<_Tp*>(malloc(__n * sizeof(_Tp))); if (!__ret) std::__throw_bad_alloc(); return __ret; } // __p is not permitted to be a null pointer. void deallocate(pointer __p, size_type) { free(static_cast<void*>(__p)); } size_type max_size() const _GLIBCXX_USE_NOEXCEPT { return size_t(-1) / sizeof(_Tp); } #ifdef __GXX_EXPERIMENTAL_CXX0X__ template<typename _Up, typename... _Args> void construct(_Up* __p, _Args&&... __args) { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } template<typename _Up> void destroy(_Up* __p) { __p->~_Up(); } #else // _GLIBCXX_RESOLVE_LIB_DEFECTS // 402. wrong new expression in [some_] allocator::construct void construct(pointer __p, const _Tp& __val) { ::new((void *)__p) value_type(__val); } void destroy(pointer __p) { __p->~_Tp(); } #endif }; template<typename _Tp> inline bool operator==(const KgpAllocator<_Tp>&, const KgpAllocator<_Tp>&) { return true; } template<typename _Tp> inline bool operator!=(const KgpAllocator<_Tp>&, const KgpAllocator<_Tp>&) { return false; } } //-------- KGP utils & support ------------ #include <string> //need for basic_string namespace kgp { //------------------------------------------------------------------------------------- typedef std::basic_string<char, std::char_traits<char>, std::KgpAllocator<char> > emb_string; /// A string of @c char class compare { public: inline bool operator() (const char lhs, const char rhs) const {return lhs < rhs;} inline bool operator() (const int& lhs, const int& rhs) const {return lhs < rhs;} inline bool operator() (const float& lhs, const float& rhs) const {return lhs < rhs;} inline bool operator() (const double& lhs, const double& rhs) const {return lhs < rhs;} inline bool operator() (const char* lhs, const char* rhs) const {return strcmp(lhs,rhs) < 0 ;} inline bool operator() (const emb_string& lhs, const emb_string& rhs) const {return lhs==rhs;} }; } using namespace std; using namespace kgp; #endif /* __SUPSTL_H__ */ __cxa_impl.h /* * __cxa_impl.h * * Created on: 28 янв. 2016 г. * Author: klen */ #ifndef __CXA_IMPL_H__ #define __CXA_IMPL_H__ // KGP tools embedded SDK // Chernov S.A. aka klen // [email protected] #ifdef __cplusplus extern "C" { #endif __extension__ typedef int __guard __attribute__((mode (__DI__))); int __attribute__((__noreturn__)) inline __cxa_atexit(void (*func) (void *), void * arg, void * dso_handle) { throw_exeption_catcher(); } int __attribute__((__noreturn__)) inline __cxa_guard_acquire(__guard* g) { throw_exeption_catcher(); //return !*g; } void __attribute__((__noreturn__)) inline __cxa_guard_release (__guard* g) { throw_exeption_catcher(); *g = 1; } void __attribute__((__noreturn__)) inline __cxa_guard_abort (__guard*) { throw_exeption_catcher(); } void __attribute__((__noreturn__)) inline __cxa_pure_virtual() { throw_exeption_catcher(); } #ifdef __cplusplus } #endif #endif __aeabi_impl.h /* * __aeabi_impl.h * * Created on: 28 янв. 2016 г. * Author: klen */ #ifndef __AEABI_IMPL_H__ #define __AEABI_IMPL_H__ // KGP tools embedded SDK // Chernov S.A. aka klen // [email protected] #include "__cxa_impl.h" #ifdef __cplusplus extern "C" { #endif int inline __aeabi_atexit(void* object, void (*destroyer)(void*), void* dso_handle) { // atexit(f) should call __aeabi_atexit (NULL, f, NULL) // The meaning of this function is given by the following model implementation... return __cxa_atexit(destroyer, object, dso_handle); // 0 ⇒ OK; non - 0 ⇒ failed } #ifdef __cplusplus } #endif #endif /* __AEABI_IMPL_H__ */ заинклудте эти хидеры и реализуйте хоть как нибудь malloc/free, можно из newlib (он есть по умолчанию в сборке в виде libc) и кстате да! забыл что тут же уменя есть класс emb_string - использовать как std::string :) Изменено 6 сентября, 2016 пользователем klen [codebox] для длинного кода. [code]-для короткого!!! Грамматика! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 7 сентября, 2016 Опубликовано 7 сентября, 2016 (изменено) · Жалоба Количественно точно пока не скажу, но в программе, скомпилированной последней протестированной мною версии от klen, фильтр (fir, float) работает по ощущениям быстрее процентов на 15, чем в текущей версии с launchpad (gcc-arm-none-eabi-5_4-2016-q2-update). Изменено 7 сентября, 2016 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 7 сентября, 2016 Опубликовано 7 сентября, 2016 · Жалоба все тоже самое для win32 www.klen.org/Files/DevTools/i686-kgp-mingw32/arm-kgp-eabi_@_i686-kgp-mingw32_20160907_VACCINIUM.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 7 сентября, 2016 Опубликовано 7 сентября, 2016 · Жалоба win64: на том же файле (с изменениями), что и раньше падало - случай с Cortex-A9: ../usbd.c: In function 'usb0_function_SetDescriptor': ../usbd.c:2410:13: internal compiler error: tree check: expected ssa_name, have integer_cst in ptr_deref_may_alias_decl_p, at tree-ssa-alias.c:211 static void usb0_function_SetDescriptor(uint_fast8_t ReqTypeRecip, uint_fast16_t ReqValue, uint_fast16_t ReqIndex, uint_fast16_t ReqLength) ^~~~~~~~~~~~~~~~~~~~~~~~~~~ libbacktrace could not find executable to open Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 7 сентября, 2016 Опубликовано 7 сентября, 2016 · Жалоба win64: на том же файле (с изменениями), что и раньше падало - случай с Cortex-A9: ../usbd.c: In function 'usb0_function_SetDescriptor': ../usbd.c:2410:13: internal compiler error: tree check: expected ssa_name, have integer_cst in ptr_deref_may_alias_decl_p, at tree-ssa-alias.c:211 static void usb0_function_SetDescriptor(uint_fast8_t ReqTypeRecip, uint_fast16_t ReqValue, uint_fast16_t ReqIndex, uint_fast16_t ReqLength) ^~~~~~~~~~~~~~~~~~~~~~~~~~~ libbacktrace could not find executable to open Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. непонятно, падало раньше, падает сейчас или падает но не всегда... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 7 сентября, 2016 Опубликовано 7 сентября, 2016 (изменено) · Жалоба Падало раньше, Вы поправили и перестало падать. Сейчас опять. Диагностика совпадает. Обсуждалось тут http://electronix.ru/forum/index.php?showt...t&p=1430750 Препроцессированный файл, вызывающий падение - в аттаче. usbd.zip Изменено 7 сентября, 2016 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 8 сентября, 2016 Опубликовано 8 сентября, 2016 · Жалоба ... это всё конечно круто, спасибо за код. Но меня тут начали беспокоить внезапные сомнения в применении переопределённого оператора new без исключений. Судя по asm листингам, сразу после вызова оператора new идёт выполнение конструктора, т.е. всё "весело" грохнется если вдруг new вернёт null ... По теории можно применить placement new, сначала выделить память, проверить что её хватило, а потом уже new на эту память. Остаётся вопрос о возможных последствиях выполнения delete на созданный объект. Вероятно всё сработает как надо, вызовется деструктор, а потом память освободится, но везде в примерах пишут явный вызов деструктора и затем явное освобождение памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 8 сентября, 2016 Опубликовано 8 сентября, 2016 · Жалоба это же по месту делается .... применительно к моим хидерам такой вариант: #ifndef __SUPC++_H__ #define __SUPC++_H__ // KGP tools embedded SDK // Chernov S.A. aka klen // [email protected] #include <stddef.h> // define size_t #include <bits/c++config.h> // nedded for _GLIBCXX_NOEXCEPT macro and c++ exception handler redefinition //------------------------------------------------------------------ // default throw catchers __attribute__((__noreturn__)) inline void throw_exeption_catcher() { while(1) asm volatile("nop") ; } __attribute__((__noreturn__)) inline void throw_exeption_catcher(const char* msg) { // save mgs addr to r0 for avoid GCC optimisation asm volatile ("ldr r0 , %[msg]" : : [msg]"m" (msg) : ) ; while(1) asm volatile("nop") ; } __attribute__((__noreturn__)) inline void throw_exeption_catcher(int val) { // save mgs addr to r0 for avoid GCC optimisation asm volatile ("ldr r0 , %[val]" : : [val]"m" (val) : ) ; while(1) asm volatile("nop") ; } // переопределение обработчиков исключений #include <bits/exception_defines.h> #define THROW_CATCHER_ARG(ret_t,name,arg_t,arg_v) __attribute__((__noreturn__)) inline ret_t name(arg_t arg_v) {throw_exeption_catcher(arg_v);} #define THROW_CATCHER_FMT(name) __attribute__((__noreturn__)) __attribute__((__format__(__printf__, 1, 2))) \ inline void name(const char* fmt, ...) {throw_exeption_catcher(fmt);} namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION THROW_CATCHER_ARG(void,__throw_bad_exception,void,) // Helper for exception objects in <except> THROW_CATCHER_ARG(void,__throw_bad_alloc,void,) // Helper for exception objects in <new> THROW_CATCHER_ARG(void,__throw_bad_cast,void,) // Helper for exception objects in <typeinfo> THROW_CATCHER_ARG(void,__throw_bad_typeid,void,) THROW_CATCHER_ARG(void,__throw_logic_error,const char*,msg) // Helpers for exception objects in <stdexcept> THROW_CATCHER_ARG(void,__throw_domain_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_invalid_argument,const char*,msg) THROW_CATCHER_ARG(void,__throw_length_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_out_of_range,const char*,msg) THROW_CATCHER_ARG(void,__throw_runtime_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_range_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_overflow_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_underflow_error,const char*,msg) THROW_CATCHER_ARG(void,__throw_ios_failure,const char*,msg) // Helpers for exception objects in <ios> THROW_CATCHER_ARG(void,__throw_system_error,int,val) THROW_CATCHER_ARG(void,__throw_future_error,int,val) THROW_CATCHER_ARG(void,__throw_bad_function_call,void,) // Helpers for exception objects in <functional> THROW_CATCHER_FMT(__throw_out_of_range_fmt) _GLIBCXX_END_NAMESPACE_VERSION } // namespace namespace __gnu_cxx { _GLIBCXX_BEGIN_NAMESPACE_VERSION THROW_CATCHER_ARG(void,__verbose_terminate_handler,void,) _GLIBCXX_END_NAMESPACE_VERSION }; extern "C" void *malloc( size_t WantedSize ) ; extern "C" void free( void* pv ); // see referense of 'noexcept' in $TARGET/lib/gcc/$TARGET/X.X.X/include/c++/$TARGET/bits/c++config.h // _GLIBCXX_NOEXCEPT is macro wrap of noexcept //------------------------------------------------------------------ // определение функции оператор new inline void* operator new(size_t size) _GLIBCXX_NOEXCEPT { void *p; /* malloc (0) is unpredictable; avoid it. */ if (size == 0) size = 1; while (__builtin_expect ((p = malloc (size)) == 0, false)) { std::__throw_bad_alloc(); } return p; } //------------------------------------------------------------------ // определение функции оператор delete inline void operator delete(void* ptr) _GLIBCXX_NOEXCEPT { free(ptr) ; } inline void operator delete(void* ptr , size_t size) _GLIBCXX_NOEXCEPT { free(ptr) ; } //------------------------------------------------------------------ // определение функции оператор new[] inline void* operator new[] (size_t size) _GLIBCXX_NOEXCEPT { void *p; /* malloc (0) is unpredictable; avoid it. */ if (size == 0) size = 1; while (__builtin_expect ((p = malloc (size)) == 0, false)) { std::__throw_bad_alloc(); } return p; } //------------------------------------------------------------------ // определение функции оператор delete[] inline void operator delete[] (void* ptr) _GLIBCXX_NOEXCEPT { free(ptr) ; } inline void operator delete[] (void* ptr, size_t size) _GLIBCXX_NOEXCEPT { free(ptr) ; } #endif /* __SUPC++_H__ */ если хотите - всуньте свой обработчик. но.... зачем, если конструктор упал все поехало уже не туда и в зад не вернешься. в hardfault все посмотрим для отладки проблемы. я так считаю что нужна писать чтобы отказа памяти не было - я разрабатываю в 99% случаев прилагухи жестко реального времени. поэтому обрабатывать ошибки и отказы уже поздно если они вылезли :) c delete b free тут вообще ничего не сделаешь, если прилетел ненулевой указатель ктож его знает валидный он или нет. я как так вижу эти моменты... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 9 сентября, 2016 Опубликовано 9 сентября, 2016 · Жалоба ну как бы да, можно жёстко ограничить число выделяемых объектов чтобы память 100% не закончилась. А мне хочется и другой вариант попробовать, складывать команды в очередь пока есть свободная память, а потом, те что не влезают, выкидывать. С обычным new это невозможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться