- emplace pair - 2 Updates
- Verify my implementation of move operations - 5 Updates
- Why can't member functions be called statically? - 7 Updates
- Initialization of static non-const and general purpose class members - 1 Update
- I will code for the following real-time OSs... - 2 Updates
- Please read again, i correct - 2 Updates
- Selling faster to make more money - 1 Update
- We have to be smart - 1 Update
- About coding for real-time systems.. - 1 Update
- I will stop coding for real-time systems - 1 Update
- About real-time OSs.. - 1 Update
- My C++ MemPool for real-time systems was updated to version 1.01 - 1 Update
| "Christopher J. Pisz" <cpisz@austin.rr.com>: Mar 13 11:00PM -0500 If I understand emplace correctly, rather than make an object and pass it to emplace, I pass the arguments to the object's constructor and it is "created in place", saving a copy construction. This works handy for vector<T> myVector; by calling myVector.emplace_back with T's constructor arguments. However, when I use unordered_map<int, T> and call emplace, it seems I need to pass the arguments to the pair, one of which is going to be T(), so I am still making an extra copy of T... Is there some way around that? |
| "Alf P. Steinbach" <alf.p.steinbach+usenet@gmail.com>: Mar 14 03:46PM +0100 On 14-Mar-17 5:00 AM, Christopher J. Pisz wrote: > need to pass the arguments to the pair, one of which is going to be T(), > so I am still making an extra copy of T... > Is there some way around that? When you control the wrapper's code (here that would be the pair class' code) then you can use Boost in-place factories. See <url: http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html>. I don't like that solution: it feels unclean, what with a `void*` involved, and just in general. But it's a solution for a general class of cases. Which does not include your case; just worth being aware of. • • • Otherwise you can use indirection. David Wheeler: "All problems in computer science can be solved by another level of indirection". Essentially that means using pointers as your value type, and dynamic allocation. Uh oh… "Dynamic allocation"?!? That's going to take one heck of a performance hit, won't it? Well no, not if it's done right for this particular case. Because your container is clearly the /owner/ of those value objects. And that means that ordinary slow-as-molasses inefficient raw C++ dynamic allocation can be replaced with super-fast dedicated dynamic allocation. It can be done in many different ways. The idea that popped up from my association circuits as "the" way to do that is to use a sequence `std::vector`s as storage, and a free-list to manage individual items. When all allocated storage has been used, create a new vector of double size as the last one. The doubling strategy (which is similar to a vector's internal buffer management) means that the number of raw dynamic allocations will only be O(log n) in the number of items managed by the allocator. Example, showing only the allocation idea, with debugging / clarifying clog statements: #include <utility> // std::move #include <vector> // std::vector #include <stack> // std::stack #include <stddef.h> // ptrdiff_t #include <type_traits> // std::(aligned_storage) #include <iostream> using std::clog; namespace my { using std::aligned_union_t; using std::move; using std::stack; using std::vector; using Size = ptrdiff_t; struct Node { Node* next; }; auto unlinked( Node*& p ) -> Node* { Node* result = p; p = p->next; return result; } // This class is just to be sure that no vector is ever /copied/, because that // could invalidate pointers and references to items in its buffer. template< class Item > struct Non_copyable_vector { vector<Item> v; Non_copyable_vector() {} Non_copyable_vector( Non_copyable_vector const& ) = delete; Non_copyable_vector( Non_copyable_vector&& other ) : v( move( other.v ) ) // vector guarantees ptr validity after move. {} // (which is why it can't use fast `realloc`) }; namespace tag { template< class Item > struct Storage_ptr_ { Item* value; }; struct Do_nothing {}; }; template< class Item > class Fixed_size_allocator { private: using Item_storage_bytes = aligned_union_t< 0, Item, Node >; static_assert( alignof( Item_storage_bytes ) >= alignof( Item ), "!" ); static_assert( alignof( Item_storage_bytes ) >= alignof( Node ), "!" ); struct Item_storage { Item_storage_bytes bytes; Item_storage( tag::Do_nothing ) {} // Fast do-nothing construction. }; static_assert( alignof( Item_storage ) >= alignof( Item_storage_bytes ), "!" ); using Storage = stack< Non_copyable_vector< Item_storage > >; Storage storage_; Node* first_free_ = nullptr; public: auto allocate() -> tag::Storage_ptr_<Item> // Points to uninitialized storage. { if( first_free_ ) { clog << "| using first free\n"; return { reinterpret_cast<Item*>( unlinked( first_free_ ) ) }; } if( storage_.top().v.size() == storage_.top().v.capacity() ) { Size const new_capacity = 2*storage_.top().v.size(); clog << "| adding new vector with capacity " << new_capacity << "\n"; storage_.push( {} ); storage_.top().v.reserve( new_capacity ); // Raw allocation. } vector<Item_storage>& v = storage_.top().v; v.emplace_back( tag::Do_nothing{} ); // Hopefully this is fast. clog << "| using vector item " << &v.back() << "\n"; return {reinterpret_cast<Item*>( &v.back() )}; } Fixed_size_allocator() { storage_.push( {} ); storage_.top().v.reserve( 1 ); // Or some higher initial capacity. } }; } // namespace my template< class Item > auto operator new( size_t const size, my::Fixed_size_allocator<Item>& a ) -> void* { return a.allocate().value; } #include <iostream> using namespace std; auto main() -> int { using namespace my; Fixed_size_allocator<int> fsa; vector<int*> v; for( int i = 0; i < 10; ++i ) { cout << i << endl; v.push_back( new( fsa ) int{ i } ); } for( int* const p : v ) { cout << *p << " "; } cout << endl; } I suggest you just wrap your container (of key->pointer pairs) together with a Fixed_size_allocater, in a suitable little wrapper class. To destroy non-POD items you can call the destructor of the item, then if necessary deallocate its storage (add it to the free list). Cheers & hth., + maybe a little challence :), - Alf |
| "Christopher J. Pisz" <cpisz@austin.rr.com>: Mar 13 10:56PM -0500 Can someone verify I implemented the C++11 move constructor and move assignment operators correctly in a few classes? I just updated https://github.com/ChristopherPisz/ECommerce/tree/master/Domain If someone could look at Customer and Order classes there (they are pretty simplistic) I am still getting used to using C++11 since past jobs didn't use modern compilers. I think I am getting the hang of it, but want to make sure. Copying here for the newsgroup purists: #pragma once // Project Includes #include "DomainLibrary.h" // Boost Includes #include <boost/optional.hpp> // Standard Includes #include <string> //------------------------------------------------------------------------------ class DOMAIN_API Customer { public: Customer(const unsigned int Id); Customer(const unsigned int id , const std::string & name , const std::string & address , const boost::optional<unsigned int> & age); Customer(const Customer & rhs); Customer(const Customer && rhs); Customer & operator = (const Customer & rhs); Customer & operator = (const Customer && rhs); ~Customer(); unsigned int GetId() const; std::string GetName() const; void SetName(const std::string & name); std::string GetAddress() const; void SetAddress(const std::string & address); boost::optional<unsigned int> GetAge() const; void SetAge(boost::optional<unsigned int> age); protected: unsigned int m_id; // Required std::string m_name; std::string m_address; boost::optional<unsigned int> m_age; // Not set = DBNULL }; // Project Includes #include "Customer.h" //------------------------------------------------------------------------------ Customer::Customer(const unsigned int id) : m_id(id) { } //------------------------------------------------------------------------------ Customer::Customer(const unsigned int id , const std::string & name , const std::string & address , const boost::optional<unsigned int> & age) : m_id (id) , m_name (name) , m_address(address) , m_age () { } //------------------------------------------------------------------------------ Customer::Customer(const Customer & rhs) : m_id (rhs.m_id) , m_name (rhs.m_name) , m_address(rhs.m_address) , m_age (rhs.m_age) { } //------------------------------------------------------------------------------ Customer::Customer(const Customer && rhs) : m_id (rhs.m_id) , m_name (rhs.m_name) , m_address(rhs.m_address) , m_age (std::move(rhs.m_age)) { } //------------------------------------------------------------------------------ Customer & Customer::operator = (const Customer & rhs) { if( this == &rhs ) { return *this; } m_id = rhs.m_id; m_name = rhs.m_name; m_address = rhs.m_address; m_age = rhs.m_age; return *this; } //------------------------------------------------------------------------------ Customer & Customer::operator = (const Customer && rhs) { if( this == &rhs ) { return *this; } m_id = rhs.m_id; m_name = rhs.m_name; m_address = rhs.m_address; m_age = std::move(rhs.m_age); return *this; } //------------------------------------------------------------------------------ Customer::~Customer() { } //------------------------------------------------------------------------------ unsigned int Customer::GetId() const { return m_id; } //------------------------------------------------------------------------------ std::string Customer::GetName() const { return m_name; } //------------------------------------------------------------------------------ void Customer::SetName(const std::string & name) { m_name = name; } //------------------------------------------------------------------------------ std::string Customer::GetAddress() const { return m_address; } //------------------------------------------------------------------------------ void Customer::SetAddress(const std::string & address) { m_address = address; } //------------------------------------------------------------------------------ boost::optional<unsigned int> Customer::GetAge() const { return m_age; } //------------------------------------------------------------------------------ void Customer::SetAge(boost::optional<unsigned int> age) { m_age = age; } #pragma once // Project Includes #include "DomainLibrary.h" #include "OrderItem.h" // Standard Includes #include <string> #include <unordered_map> #include <vector> //------------------------------------------------------------------------------ class DOMAIN_API Order { public: // Unordered Map is probably the best choice since we will be removing by ID // // Key - Inventory Item ID // Value - The OrderItem typedef std::unordered_map<unsigned int, OrderItem> CollectionType; enum OrderStatus { CREATED = 0 , ORDERED // We got paid , READY_FOR_DELIVERY , DELIVERED , CANCELED }; Order(const unsigned int id , const unsigned int customerId); Order(const unsigned int id , const unsigned int customerId , const CollectionType & orderItems); Order(const Order & rhs); Order(const Order && rhs); Order & operator = (const Order & rhs); Order & operator = (const Order && rhs); virtual ~Order(); unsigned int GetId() const; unsigned int GetCustomerId() const; OrderStatus GetOrderStatus() const; void SetOrderStatus(const OrderStatus orderStatus); void AddOrderItem(const OrderItem & orderItem); void RemoveOrderItem(unsigned int itemId); CollectionType GetOrderItems() const; void SetOrderItems(const CollectionType & orderItems); protected: unsigned int m_id; unsigned int m_customerId; OrderStatus m_status; CollectionType m_orderItems; }; // Project Includes #include "Order.h" // Standard Includes #include <algorithm> #include <iterator> //------------------------------------------------------------------------------ Order::Order(const unsigned int id , const unsigned int customerId) : m_id (id) , m_customerId(customerId) , m_status (CREATED) { } //------------------------------------------------------------------------------ Order::Order(const unsigned int id , const unsigned int customerId , const CollectionType & orderItems) : m_id (id) , m_customerId (customerId) , m_status (CREATED) , m_orderItems (orderItems) { } //------------------------------------------------------------------------------ Order::Order(const Order & rhs) : m_id (rhs.m_id) , m_customerId (rhs.m_customerId) , m_status (rhs.m_status) , m_orderItems (rhs.m_orderItems) { } //------------------------------------------------------------------------------ Order::Order(const Order && rhs) : m_id (rhs.m_id) , m_customerId(rhs.m_customerId) , m_status (rhs.m_status) { std::move(rhs.m_orderItems.begin(), rhs.m_orderItems.end(), std::inserter(m_orderItems, m_orderItems.begin())); } //------------------------------------------------------------------------------ Order & Order::operator = (const Order & rhs) { if( this == &rhs ) { return *this; } m_id = rhs.m_id; m_customerId = rhs.m_customerId; m_status = rhs.m_status; m_orderItems = rhs.m_orderItems; return *this; } //------------------------------------------------------------------------------ Order & Order::operator = (const Order && rhs) { if( this == &rhs ) { return *this; } m_id = rhs.m_id; m_customerId = rhs.m_customerId; m_status = rhs.m_status; std::move(rhs.m_orderItems.begin(), rhs.m_orderItems.end(), std::inserter(m_orderItems, m_orderItems.begin())); return *this; } //------------------------------------------------------------------------------ Order::~Order() { } //------------------------------------------------------------------------------ unsigned int Order::GetId() const { return m_id; } //------------------------------------------------------------------------------ unsigned int Order::GetCustomerId() const { return m_customerId; } //------------------------------------------------------------------------------ Order::OrderStatus Order::GetOrderStatus() const { return m_status; } //------------------------------------------------------------------------------ void Order::SetOrderStatus(const OrderStatus orderStatus) { m_status = orderStatus; } //------------------------------------------------------------------------------ void Order::AddOrderItem(const OrderItem & orderItem) { m_orderItems.insert(std::make_pair(orderItem.GetInventoryItemId(), orderItem)); } //------------------------------------------------------------------------------ void Order::RemoveOrderItem(unsigned int itemId) { m_orderItems.erase(itemId); } //------------------------------------------------------------------------------ Order::CollectionType Order::GetOrderItems() const { return m_orderItems; } //------------------------------------------------------------------------------ void Order::SetOrderItems(const CollectionType & orderItems) { m_orderItems = orderItems; } //------------------------------------------------------------------------------ |
| Manfred <noname@invalid.add>: Mar 14 01:15PM +0100 On 3/14/2017 4:56 AM, Christopher J. Pisz wrote: > Can someone verify I implemented the C++11 move constructor and move > assignment operators correctly in a few classes? I didn't check the details, but one thing that I saw is that move assignment and constructors typically have non-const rhs arguments (they may modify the rhs as they 'move' the value out of it) Note that the standard allows for a X(const X&&) move constructor (12.8.1 as it also allows for a X(X&) copy constructor) although its example marks it as "OK, but possibly not sensible". > Customer(const Customer & rhs); > Customer(const Customer && rhs); Customer(Customer && rhs); > Customer & operator = (const Customer & rhs); > Customer & operator = (const Customer && rhs); Customer & operator = (Customer && rhs); |
| "Alf P. Steinbach" <alf.p.steinbach+usenet@gmail.com>: Mar 14 01:36PM +0100 On 14-Mar-17 4:56 AM, Christopher J. Pisz wrote: >[snip] > Copying here for the newsgroup purists: [code snipped] I tried a few times, some years ago, just attaching the code files, and apparently that worked both technically and psychologically for all readers. In Thunderbird those text file attachments appear as directly readable text at the bottom of the message. I am not sure, however, how well it works with archiving services, so I think it's best to restrict it to supplementary information, e.g. "I've attached the complete files so that readers can try this out". Cheers!, - Alf |
| scott@slp53.sl.home (Scott Lurndal): Mar 14 01:24PM >[code snipped] >I tried a few times, some years ago, just attaching the code files, and >apparently that worked both technically and psychologically for all readers. That's a broad statement, to be sure. In fact, the NNTP client that I use doesn't handle attachments gracefully. |
| Paavo Helde <myfirstname@osa.pri.ee>: Mar 14 04:27PM +0200 On 14.03.2017 5:56, Christopher J. Pisz wrote: > , m_name (rhs.m_name) > , m_address(rhs.m_address) > , m_age (std::move(rhs.m_age)) This does not call the boost::optional move constructor, because of the 'const'. Instead, it calls the standard copy constructor, which is probably not what you intended. Normally a user-defined move constructor should look like this: Customer::Customer(Customer && rhs) : m_id (rhs.m_id) , m_name (std::move(rhs.m_name)) , m_address(std::move(rhs.m_address)) , m_age (std::move(rhs.m_age)) {} Ditto for other rvalue thingies. Also, for such classes you do not actually need to write your own move constructors or assignments at all. If you delete all your copy/move constructors/assignments plus the destructor the compiler will generate all this stuff by itself. |
| "Rick C. Hodgin" <rick.c.hodgin@gmail.com>: Mar 13 06:53PM -0700 What is the underlying reason why C++ prevents non-static member functions from being called statically? If they didn't reference member variables or things which require a "this," or if they did so only under the scrutiny of discriminating control flow logic, why would it be an issue? Why should it be prevented? Thank you, Rick C. Hodgin |
| "Alf P. Steinbach" <alf.p.steinbach+usenet@gmail.com>: Mar 14 03:49AM +0100 On 14-Mar-17 2:53 AM, Rick C. Hodgin wrote: > a "this," or if they did so only under the scrutiny of discriminating > control flow logic, why would it be an issue? Why should it be > prevented? It's just the simplest rules. There is nothing to be gained by adding rules that would allow a non-this-accessing non-static member function to be called statically, because that's the case of a member function that can be called both statically and on an object, which is already covered by static member functions: that's what should be used for this case. E.g. #include <iostream> using namespace std; struct S { static void foo() {} }; auto main() -> int { S::foo(); // static call S{}.foo(); // call on an object, also OK. } Cheers & hth., - Alf |
| "Rick C. Hodgin" <rick.c.hodgin@gmail.com>: Mar 13 08:21PM -0700 On Monday, March 13, 2017 at 10:50:02 PM UTC-4, Alf P. Steinbach wrote: > There is nothing to be gained by adding rules It would be removing constraints, not adding rules. > because that's the case of a member function that can be called both > statically and on an object, which is already covered by static member > functions: that's what should be used for this case. class xyz { public: xyz(); ~xyz(); int abc(int a, int b, int c); private: static int k; }; If I were to call xyz::abc(1, 0, 0), k would be in scope because it's also static. But in addition, why couldn't an extension be added to recognize I'm calling it from a static context, and then possibly modify the dynamics by some runtime lookup? int xyz::abc(int a, int b, int c) { // If called in a static context, use this block to perform // a contextual lookup to derive the this member static { this = xyz::perform_some_lookup(a); if (!this) return -1; // No suitable context was found } // No longer static, runs with a proper context from here down } Thank you, Rick C. Hodgin |
| "Rick C. Hodgin" <rick.c.hodgin@gmail.com>: Mar 13 08:37PM -0700 On Monday, March 13, 2017 at 11:21:58 PM UTC-4, Rick C. Hodgin wrote: > } > // No longer static, runs with a proper context from here down > } Such a context would be useful in an OS message handler, for example, where messages are sent to a single function, but are intended for a specific target, and the target isn't known until a lookup is performed to identify the associated object from some list of things that the OS could be responding to. For Windows it could by the hwnd member that's used to identify the particular window instance that's being updated, along with the class related to processing that window. In that case, the code could be modified: LRESULT CALLBACK xyz::wndProc(HWND hwnd, UINT m, WPARAM w, LPARAM l) { static { this = xyz::find_related_window(hwnd); if (!this) return DefWindowProc(hwnd, m, w, l); } // Now we have the correct class instance associated with this // static callback from the OS. All members will be dynamically // referenceable now. } Thank you, Rick C. Hodgin |
| "Rick C. Hodgin" <rick.c.hodgin@gmail.com>: Mar 13 08:44PM -0700 On Monday, March 13, 2017 at 11:37:30 PM UTC-4, Rick C. Hodgin wrote: > // static callback from the OS. All members will be dynamically > // referenceable now. > } In addition, using a passed parameter to call a static reference as for spawning a thread: CreateThread(NULL, 0, &threadHandler, params, NULL, ¶ms.threadId); Dispatches to: DWORD WINAPI xyz::threadHandler(LPVOID params) { // Re-establish our local class instance static { this = ((SParams*)params)->xyz; } // Now, the statically called member function is back in // local scope, despite its necessary routing through the // OS API for thread spawning and dispatching. } And there are many other such uses, where the dynamic instance can be known, but it's just not known at the time of dispatch because it requires some kind of lookup, or a re-establishing from a passed parameter. Thank you, Rick C. Hodgin |
| Ian Collins <ian-news@hotmail.com>: Mar 14 05:07PM +1300 On 03/14/17 02:53 PM, Rick C. Hodgin wrote: > a "this," or if they did so only under the scrutiny of discriminating > control flow logic, why would it be an issue? Why should it be > prevented? Because there's no good reason not to make them static members? How could the compiler tell if a non-inline member function behaved as you describe? If you really want to, you can lie to the compiler and do: struct X { void f() {} }; int main() { static_cast<X*>(nullptr)->f(); } -- Ian |
| Jerry Stuckle <jstucklex@attglobal.net>: Mar 14 10:09AM -0400 On 3/13/2017 9:53 PM, Rick C. Hodgin wrote: > prevented? > Thank you, > Rick C. Hodgin If they didn't reference member variables or things which require a "this", then why not declare them static? As for control flow logic - that is run-time. The compiler cannot predict the control flow logic would never let it occur. -- ================== Remove the "x" from my email address Jerry Stuckle jstucklex@attglobal.net ================== |
| "Öö Tiib" <ootiib@hot.ee>: Mar 14 06:04AM -0700 On Monday, 13 March 2017 23:23:51 UTC+2, David Brown wrote: > For non-integral members, you have to have a "constexpr const" to be > able to initialise them inside the class definition, rather than outside > it. I don't know why that is the case. Is here any difference with just plain 'constexpr' (without 'const')? I know that with pointers there is really difference so in following 'const' matters: static constexpr char const* abc = "abc text"; I always try to write const right of type (or *) since IMHO that makes more clear that 'const' above is about 'char' but 'constexpr' is about 'abc'. However I don't think that this applies to array so isn't const about constexpr array just redundant? |
| Ramine <toto@toto.net>: Mar 13 09:10PM -0400 Hello, I will code for the following real-time OSs... I will not code for VxwWorks real-time OS. I will code in C++ and Delphi for the QNX real-time OS and for One Time RTOS-32.. Here is QNX: http://www.qnx.com/content/qnx/en.html And here is One Time RTOS-32 http://www.on-time.com/rtos-32.htm Thank you, Amine Moulay Ramdane. |
| "Rick C. Hodgin" <rick.c.hodgin@gmail.com>: Mar 14 05:11AM -0700 On Monday, March 13, 2017 at 9:10:19 PM UTC-4, Ramine wrote: > Hello, > I will code for the following real-time OSs... And then in the next post you say you will stop coding for real-time OSs. Can I suggest you gather your thoughts, write them down in a word processor document, ponder them for a period of time (at least a day or two, re-reading them after you've slept a time or two), and then post only your final draft with your solid thoughts? Thank you, Rick C. Hodgin |
| Ramine <toto@toto.net>: Mar 13 10:32PM -0400 Hello, I will stop coding for real-time systems.. I am an experienced programmer in parallel programming and synchronization algorithms, i have invented many synchronization algorithms , but you have to be aware that coding for real-time systems is something different, because you have to ensure a very high standards of quality, so it must be tested and retested and verified and reverified with the right tools and the right prerequisites, so it is not an easy job because real-time critical systems must be taken seriously taking into account that safety is something so so important, so i will not code for real-time critical systems because to ensure a very high standards of quality we have to be equipped with the necessary tools and the necessary prerequisites also like being a group of high qualified programmers that code for real-tiem systems to ensure a high quality of service and high quality products, but my MemPool for real-time critical systems is i think correct because i am an experienced programmer, but please take a look at my code of my MemPool to be sure that all is well. Thank you, Amine Moulay Ramdane. |
| "Fred.Zwarts" <F.Zwarts@KVI.nl>: Mar 14 09:07AM +0100 "Ramine" schreef in bericht news:oa7kjg$nqj$5@dont-email.me... >and high quality products, but my MemPool for real-time critical systems is >i think correct because i am an experienced programmer, but please take a >look at my code of my MemPool to be sure that all is well. One sentence with 16 lines. I am impressed. Is that how you write your code, too? |
| Ramine <toto@toto.net>: Mar 13 11:16PM -0400 Hello, Selling faster to make more money.. Windows is not a real-time OS , so it has evolved fast because also of selling faster to make more money , and thus it has come with many bugs and with lower quality in the past.. But today the tools to code has become more sophisticated and more efficient and smart and efficient reusability also has enhanced the quality of software services and software products, so today we are better equipped to be better satisfied, that's the reality of today. Past was the past, and today is today. Thank you, Amine Moulay Ramdane. |
| Ramine <toto@toto.net>: Mar 13 11:02PM -0400 Hello, We have to be smart.. Real-time coding and Real-time OSs don't evolve fast, because we have to ensure a very high standards of quality and safety. Standards also like C++ don't evolve fast also, because making standards takes time. But Windows is not a real-time OS. so it has evolved fast and has come with many bugs. Thank you, Amine Moulay Ramdane. |
| Ramine <toto@toto.net>: Mar 13 10:47PM -0400 Hello...... About coding for real-time systems.. Using bounded stacks and queues to ensure determinism, i know how to do it with my MemPool for real-time systems, and i have invented also many synchronization algorithms and i am an experienced programmer, but the problem of coding for real-time systems is not coding individually with just more exprerience at hand, it is coding with the right tools and the right prerequisites , and among the prerequisites is to be a group or better being a bigger group of high qualified programmers(like being Intel or Microsoft) that do the coding for real-time systems to ensure a high quality of service and high quality products that are mandatory for coding for real-time systems. Thank you, Amine Moulay Ramdane. |
| Ramine <toto@toto.net>: Mar 13 10:28PM -0400 Hello, I will stop coding for real-time systems.. I am an experienced programmer in parallel programming and synchronization algorithms, i have invented many synchronization algorithms , but you have to be aware that coding for real-time systems is something different, because you have to ensure a very high standards of quality, so it must be tested and retested and verified and reverified with the right tools and the right prerequisites, so it is not an easy job because real-time critical systems must be taking seriously taking into account that safety is something so so important, so i will not code for real-time critical systems because to ensure a very high standards of quality we have to be equipped with the necessary tools and the necessary prerequisites also like being a group of high qualified programmers that code for real-tiem systems to ensure a high quality of service and high quality products, but my MemPool for real-time critical systems is i think correct because i am an experienced programmer, but please take a look at my code of my MemPool to be sure that all is well. Thank you, Amine Moulay Ramdane. |
| Ramine <toto@toto.net>: Mar 13 09:02PM -0400 Hello, About real-time OSs.. Here is a small comparison about the two best: QNX is a memory protected micro kernel OS, which means your programs run in their own memory space chances of one stamping on another's memory is zero. VxWorks does not segregate kernel and user memory space, thereby providing the fastest communication between applications and kernel but there is still a danger of memory corruption. Thank you, Amine Moulay Ramdane. |
| Ramine <toto@toto.net>: Mar 13 07:51PM -0400 Hello.. My C++ MemPool for real-time systems was updated to version 1.01 I have tested it more with a memory leak detector and stabilized it more, and i think it is correct now. You can download the updated version from: https://sites.google.com/site/aminer68/c-mempool-for-real-time-systems Thank you, Amine Moulay Ramdane. |
| You received this digest because you're subscribed to updates for this group. You can change your settings on the group membership page. To unsubscribe from this group and stop receiving emails from it send an email to comp.lang.c+++unsubscribe@googlegroups.com. |
No comments:
Post a Comment