1. C++ / Говнокод #28222

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    #include <clcpp/clcpp.h>
    #include <clcpp/FunctionCall.h>
    
    
    // Reflect the entire namespace and implement each class
    clcpp_reflect(TestClassImpl)
    namespace TestClassImpl
    {
    	class A
    	{
    	public:
    		A()
    		{
    			x = 1;
    			y = 2;
    			z = 3;
    		}
    
    		int x, y, z;
    	};
    
    	struct B
    	{
    		B()
    		{
    			a = 1.5f;
    			b = 2.5f;
    			c = 3.5f;
    		}
    
    		float a, b, c;
    	};
    }
    
    clcpp_impl_class(TestClassImpl::A)
    clcpp_impl_class(TestClassImpl::B)
    
    void TestConstructorDestructor(clcpp::Database& db)
    {
    	const clcpp::Class* ca = clcpp::GetType<TestClassImpl::A>()->AsClass();
    	const clcpp::Class* cb = clcpp::GetType<TestClassImpl::B>()->AsClass();
    
    	TestClassImpl::A* a = (TestClassImpl::A*)new char[sizeof(TestClassImpl::A)];
    	TestClassImpl::B* b = (TestClassImpl::B*)new char[sizeof(TestClassImpl::B)];
    
    	CallFunction(ca->constructor, a);
    	CallFunction(cb->constructor, b);
    
    	CallFunction(ca->destructor, a);
    	CallFunction(cb->destructor, b);
    
    	delete [] (char*) a;
    	delete [] (char*) b;
    }

    https://github.com/Celtoys/clReflect/blob/master/src/clReflectTest/TestClassImpl.cpp

    Запостил: kcalbCube, 14 Июня 2022

    Комментарии (11) RSS

    • Там еще какой-то метакомпилятор, который для каждого класса генерирует метакласс?
      Ответить
    • >TestClassImpl::A*)new char[sizeof(TestClassImpl::A)];
      а тут не надо выравнивать рази?

      Гост, помогай
      Ответить
      • Если alignof(TestClassImpl::A) <= alignof(std​::​max_­align_­t), то с выравниванием всё нормально. А если в классе содержатся только стандартные типы и выравнивание не задано ручками, то условие должно выполняться.

        https://eel.is/c++draft/expr.new#16
        When a new-expression calls an allocation function and that allocation has not been extended, the new-expression passes the amount of space requested to the allocation function as the first argument of type std​::​size_­t.
        That argument shall be no less than the size of the object being created; it may be greater than the size of the object being created only if the object is an array and the allocation function is not a non-allocating form ([new.delete.placement]).
        For arrays of char, unsigned char, and std​::​byte, the difference between the result of the new-expression and the address returned by the allocation function shall be an integral multiple of the strictest fundamental alignment requirement of any object type whose size is no greater than the size of the array being created.
        [Note 9: Because allocation functions are assumed to return pointers to storage that is appropriately aligned for objects of any type with fundamental alignment, this constraint on array allocation overhead permits the common idiom of allocating character arrays into which objects of other types will later be placed.
        — end note]
        Ответить
        • понятно. Это сделано для обратной совместимости с сишкой, да?

          спасибо
          Ответить
        • ps: выходит, в общем случае все же отсос будет
          Ответить
          • Только если у класса или одного его членов выравнивание задано ручками. Само по себе такое случиться не может. До С++20 over-aligned типы даже с помощью new не всегда можно было создать (точнее, не гарантировалась ихх поддержка).

            Если есть вероятность появления таких типов, то да, на случай непопадания в нужное выравнивание, нужно аллоцировать памяти больше на alignof(TestClassImpl::A) - alignof(std​::​max_­align_­t), и затем применить std::align.
            Ответить
            • >не всегда можно было

              хм, я с плейсмент нью создавать объекты в куче вручную, но там надо было специально выравнивание заказывать, а не тупо malloc делать, хотя инструмент для выравнивания появился пожжы, чем плейсмент ню (хз как раньше люди жили)
              Ответить
          • Верно. Припади.
            Ответить
    • clopp clopp
      Ответить
      • Он был так грязен, что однажды, рассматривая свои ноги, он нашёл между
        пальцев засохшего клопа, которого, видно, носил в сапоге уже несколько дней.
        Ответить

    Добавить комментарий