C++ Builder

MSVC ARM64 optimizations in Visual Studio 2022 17.6 

In the last couple of months, the Microsoft C++ team has been working on improving MSVC ARM64 backend performance and we are excited to have a couple of optimizations available in the Visual Studio 2022 version 17.6. These optimizations improved code-generation for both scalar ISA and SIMD ISA (NEON). Let’s review some interesting optimizations in this blog.  Before diving into technical details, we’d encourage you to create feedback here at Developer Community if you have found performance issues. The feedback helps us prioritize work items in our backlog. This, optimize neon right shift into cmp, is an example of good feedback. Including a tagged subject title, detailed description of the issue, and a simple repro simplifies our analysis work and helps us deliver a fix more quickly.  Now, let’s see the optimizations.  Auto-Vectorizer supports more NEON instructions with asymmetric operands The ARM64 backend already supports some NEON instructions with asymmetric typed operands, like Add/Subtract Long operations (SADDL/UADDL/SSUBL/USUBL). These instructions add each vector element in the lower or upper half of the first source SIMD register to the corresponding vector element of the second source SIMD register and write the vector result to the destination SIMD register. The destination vector elements are twice as long as the source vector elements. Now, we have extended such support to Multiply-Add Long and Multiply-Subtract Long (SMLAL/UMLAL/SMLSL/UMLSL).  For example:  void smlal(int * __restrict dst, int * __restrict a,             short * __restrict b, short * __restrict c)  {  for (int i = 0; i < 4; i++)  dst[i] = a[i] + b[i] * c[i];  } In Visual Studio 2022 17.5, the code-generation was:  sxtl        v19.4s,v16.4h  sxtl        v18.4s,v17.4h  mla         v20.4s,v18.4s,v19.4s    Extra signed extensions are performed on both source operands to match the type of destination. Now it has been optimized into a single smlal v16.4s,v17.4h,v18.4h.  The ARM64 ISA further supports another variant for these operations, which is called Add/Subtract Wide. For them, the asymmetry happens between source operands, not between source and destination.  For example:  void saddw(int *__restrict dst, int *__restrict a, short *__restrict b)  {  for (int i = 0; i < 4; i++)  dst[i] = a[i] + b[i];  } In Visual Studio 2022 17.5, the code-generation was:  sxtl        v17.4s,v16.4h  add         v18.4s,v17.4s,v18.4s   The narrow source gets extra signed extension to match the other wide source. In the 17.6 release, this has been optimized into a single saddw v16.4s,v16.4s,v17.4h. The same applies to UADDW/SSUBW/USUBW.  Auto-vectorizer now supports small types on ABS/MIN/MAX  ABS/MIN/MAX have slightly complex semantics. Normally, the compiler middle-end or back-end will have a pattern matcher to recognize IR sequences with if-then-else semantics and see if they could be converted into ABS/MIN/MAX. There is an issue when the operands are in small types (int8 or int16) though.   As specified by the C++ standard, small types are promoted to int, which is 32-bit on ARM64. This is perfect for scalar operations because they really can only operate on scalar register width. For ARM64, the smallest width is 32-bit utilizing the sub-register. However, this is not true for SIMD ISA whose minimum operation width is the width of vector lane (element). For example, ARM64 NEON supports operating on int8, int16 for a couple of operations including ABS/MIN/MAX. So, to generate SIMD instructions operating on small element sizes and deliver higher computing throughput, the auto-vectorizer needs to do […]

Read More

What is Avoiding Implicit Copy Assignment In C++?

Object-Oriented Programming (OOP) is a method of mapping real-world objects and data to computer functions and data structures. Classes and Objects are part of object-oriented methods and typically provide features such as properties and methods. In Modern C++, one of the features of OOP is copy assignment operator that is used with “operator=” to create a new object from an existing one. In this post, we explain what we mean by “avoiding implicit copy assignment operator”, and how can we use the delete option with copy assignment in C++ examples. What are classes and objects in C++? Classes are defined in C++ using the keyword class followed by the name of the class. Classes are the blueprint for the objects and they are user-defined data types that we can use in our program. Objects are an instantiation of a class, In C++ programming, because it is designed to be strongly object oriented most of the commands are associated with classes and objects, along with their attributes and methods. Here is a simple class example below.   class Tmyclass {           public:       std::string str; };   Then we can create our objects with this Type of myclass as below. What is copy assignment operator with delete option in C++? The Copy Assignment Operator in a class is a non-template non-static member function that is declared with the “operator=“. Normally, a copy assignment operator is assigned in any class deceleration as default. For example, we can copy two object properties as below;   class Tmyclass {           public:       std::string str; };   Tmyclass o1, o2;   o1.str = “LearnCPlusPlus.org”;   o2 = o1;   When you create a class or a type that is copy assignable (that you can copy with the = operator symbol), sometime you don’t want it to be copied with other external code lines. In this situation, you need to use copy assignment operator with delete option. Here is a simple syntax for the copy assignment operator with delete option; Syntax (Since C++11),   class_name & class_name :: operator= ( const class_name& ) = delete;   Here is an example in a class:   Tmyclass& operator=( const Tmyclass& other) = delete; // Deleting Copy Assignment Operator   What is avoiding implicit copy assignment in C++? In C++, the Copy Assignment operator is default in any class declaration and it is automatically declared. This is also called as the forced copy assignment operator which is default in any class declarations. This means, if you don’t want this default feature, you should delete by using delete option as given syntax above. Let’s give a simple C++ example of the copy assignment operator with default option, here is a simple class:   class Tmyclass {   public:   std::string str; };   In modern C++, this simple class has hidden copy assignment operator as default that is created automatically, this class example is same as below:   class Tmyclass {   public:   std::string str;     Tmyclass& operator=( const Tmyclass& other) = default; // Copy Assignment Operator   };   As you see both are same, and if you want to delete this copy operator to avoid implicit copy assignment usage, you need to use delete option as below.   class Tmyclass {   public:   std::string str;     Tmyclass& operator=( const Tmyclass& other) = delete; // Deleted Copy Assignment Operator   };   And here […]

Read More

Pure Virtual C++ 2023 Pre-Conference Videos

Pure Virtual C++ is our free, annual, one-day virtual conference for the whole C++ community. This year it is running June 6th and you can find the session list and sign-up for free on the event page. In the run up to the conference we will be publishing new C++ videos every day. You can find the playlist on YouTube. The first two videos on Breakpoint Groups and Improved Step Filtering in the Visual Studio Debugger are live now!

Read More

What Is A Copy Assignment Operator in C++?

Object-Oriented Programming (OOP) is a method of mapping real-world objects and data to computer functions and data structures. Classes and Objects are part of object-oriented methods and typically provide features such as properties and methods. One of the features of an OOP Editor is a copy assignment operator that is used with “operator=” to create a new object from an existing one. In this post, we explain what a copy assignment operator is along with some C++ examples. What are classes and objects in C++? Classes are defined in C++ using the keyword class followed by the name of the class. Classes are the blueprint for the objects and they are user-defined data types that we can use in our program. Objects are an instantiation of a class, In C++ programming, because it is designed to be strongly object oriented most of the commands are associated with classes and objects, along with their attributes and methods. Here is a simple class example below.   class myclass {           public:       std::string str; };   What is a copy assignment operator in C++? The Copy Assignment Operator in a class is a non-template non-static member function that is declared with the “operator=“. When you create a class or a type that is copy assignable (that you can copy with the = operator symbol), it must have a public copy assignment operator. Here is a simple syntax for the typical declaration of a copy assignment operator which is defaulted, Syntax (Since C++11).   class_name & class_name :: operator= ( const class_name& ) = default;   Here is an example in a class.   Tmyclass& operator=(const Tmyclass& other) = default; // Copy Assignment Operator   Is there a simple example of using the copy assignment operator in C++? The forced copy assignment operator is default in any class declarations. This means you don’t need to declare it as above, let’s give examples without using it. Let’s give a simple C++ example to copy assignment operator with default option, here is a simple class.   class myclass {   public:   std::string str;   };   Because this is default in any class declaration, and it is automatically declared. This class is same as below.   class myclass {   public:   std::string str;     Tmyclass& operator=(const Tmyclass& other) = default; // Copy Assignment Operator };   And here is how you can use this “=” copy assignment operator with both class examples above.   Tmyclass o1, o2;   o2 = o1; // Copy Assingment Operator   Is there a full example of how to use the copy assignment operator in C++? An example with a copy assignment operator in a Class. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27   #include #include   class Tmyclass {   public:   std::string str;        // Tmyclass& operator=(const Tmyclass& other) = default; // Copy Assignment Operator };   int main() { Tmyclass o1, o2;   o1.str = “LearnCplusplus.org”;   o2 = o1; // Using Copy Assingment Operator   std::cout

Read More

Typical Declaration Of A Copy Assignment Operator With std::swap

Object-Oriented Programming (OOP) is a method of mapping real-world objects and data to computer functions and data structures. Classes and Objects are part of object-oriented methods and typically provide features such as properties and methods. One of the features of an OOP tool is the copy assignment operator that is used with “operator=” to create a new object from an existing one. In this post, we explain the typical declaration of a copy assignment operator with C++ examples. What are classes and objects in C++? Classes are defined in C++ using the keyword class followed by the name of the class. Classes are the blueprint for the objects and they are user-defined data types that we can use in our program. Objects are an instantiation of a class, In C++ programming, because it is designed to be strongly object oriented most of the commands are associated with classes and objects, along with their attributes and methods. Here is a simple class example below.   class myclass {           public:       std::string str; };   What is a copy assignment operator in C++? The Copy Assignment Operator in a class is a non-template non-static member function that is declared with the “operator=“. When you create a class or a type that is copy assignable (that you can copy with the = operator symbol), it must have a public copy assignment operator. Here is a simple syntax for the typical declaration of a copy assignment operator when the swap is used. Syntax:   class_name & class_name :: operator= ( class_name )   Here is an example in a class.   class Tmyclass {   public:   Tmyclass& operator=(Tmyclass other) // Using Copy Assingment Operator   {    // Copy or swap things    return *this;   } };   What is a typical declaration of a copy assignment operator with std::swap? Let’s give a simple C++ example of a typical declaration of a copy assignment operator with std::swap.   class myclass {   public:   std::string str;     myclass& operator=(myclass other)   {        std::cout

Read More

Typical Declaration Of A Copy Assignment Operator Without std::swap

Object-Oriented Programming (OOP) is a method of mapping real-world objects and data to computer functions and data structures. Classes and Objects are part of object-oriented methods and typically provide features such as properties and methods. One of the features of an OOP IDE is the copy assignment operator that is used with “operator=” to create a new object from an existing one. In this post, we explain what the typical declaration of copy assignment operator is along with some C++ examples. What are classes and objects in C++? Classes are defined in C++ using the keyword class followed by the name of the class. Classes are the blueprint for the objects and they are user-defined data types that we can use in our program. Objects are an instantiation of a class, In C++ programming, because it is designed to be strongly object oriented most of the commands are associated with classes and objects, along with their attributes and methods. Here is a simple class example below.   class myclass {           public:       std::string str; };   What is copy assignment operator in C++? The Copy Assignment Operator in a class is a non-template non-static member function that is declared with the “operator=“. When you create a class or a type that is copy assignable (that you can copy with the = operator symbol), it must have a public copy assignment operator. Here is a simple syntax for the typical declaration of a copy assignment operator when the copy and swap idiom is not used, Syntax.   class_name & class_name :: operator= ( const class_name& )   Here is an example in a class.   Tmyclass& operator=( const Tmyclass& other) // Using Copy Assingment Operator { if (this != &other) // not a self-assignment { // Copy or swap things }    return *this; }   What is typical declaration of a copy assignment operator without std::swap? Let’s give a simple C++ example of the typical declaration of a copy assignment operator with std::swap. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17   class Tmyclass {   public:   std::string str;     Tmyclass& operator=( const Tmyclass& other) // Using Copy Assingment Operator   { if (this != &other) // not a self-assignment { std::cout

Read More

5 New Posts With Free C++ Builder CE, Dev-C++, BCC, GCC Examples

Hello developers, if you just starting out on your C++ journey and want to jump to a modern IDE and C++ compiler, there is a free version of C++ Builder, C++ Builder 11 CE Community Edition released on April 2023. If you are a start-up developer, student, hobbyist, or just interested in learning to code then the C++ Builder Community Edition may well be just the thing for you. Read the FAQ notes on the CE license and then simply fill out the form to download C++ Builder 11 CE. Today we have 5 more C++ posts, some of C++ examples in these posts can be used with C++ Builder or the C++ Builder 11 CE Community Edition, and others can be used with Dev-C++, BCC C++ Compilers, and some other compilers such as the GCC compiler. Table of Contents Where can I learn to program with free C++ examples? What is new in C++ Builder CE? What are the important features of C++ that can be used with C++ Builder CE? Learn C++ Builder CE with C++ examples Get in touch and tell us what you’d like to see on the blogs What might be next for C++ Builder? Where can I learn to program with free C++ examples? If you don’t know anything about C++ or the C++ Builder IDE, don’t worry, we have a lot of great examples on LearnCPlusPlus.org website and they’re all completely free. Just visit this site and copy and paste any examples there into a new Console, VCL, or FMX project, depending on the post example. We keep adding more C and C++ posts with sample code. In today’s round-up of recent posts on LearnCPlusPlus.org, we have new C and C++ posts with very simple examples that can be used with: The free version of C++ Builder 11 CE Community Edition or a professional C++ Builder  or free BCC32C C++ Compiler and BCC32X C++ Compiler or the free Dev-C++ What is new in C++ Builder CE? C++ Builder 11 CE which is the free Edition of C++ Builder has been recently released. Embarcadero has made available a Community Edition license for the most recent 11.3 release of Delphi and C++Builder. This is a free edition of either Delphi or C++Builder for students, hobbyists, and startups (as the license is revenue-limited). What are the important features of C++ that can be used with C++ Builder CE? C++ is one of the most powerful programming languages that we use for all sorts of purposes, from regular applications, games, business, industrial infrastructure, robotics, and in the control of IoT devices. The most well-known controllers for those areas where human and computer interaction are important and stretches beyond simple keyboard input are joysticks or gamepads. One of the simplest examples to use them on Windows is using the venerable XInput library which has been around for quite a long time but can still be easily used with the latest C++ Compiler. In the first post, we explain how you can use a gamepad or joystick controller in C++ with the Xinput library. https://learncplusplus.org/how-to-use-a-game-pad-or-joystick-controller-in-c-on-windows/ C++ Builder is the easiest and fastest C++ IDE for building professional applications with powerful GUI components like Memo, Edit, ListBox, StringGrid and many more. Each component can be skinned with Styles to change their visual appearance. Styles are very powerful and because of this it can […]

Read More

What Is The Rule of Zero in C++?

Object Oriented Programming (OOP) is a way to integrate with objects which can contain data in the form (attributes or properties of objects), and code blocks in the form of procedures (methods, functions of objects). These attributes and methods are variables and functions that belong to the class – part of the class’s code and they are generally referred to as class members. Classes and structs are very useful in modern programming. There are some rules to support the principles of programming, one of which is the Rule of Zero in C++. In this post, we explain what is Rule of Zero in C++ with examples. What is resource acquisition in C++? The principle of Resource Acquisition Is Initialization (RAII) term used in several OOP programming languages, which relates to the ability to manage resources, such as memory, through the copy and move constructors, destruction, and assignment operators. RAII is about the declaration and use of destructors, copy-move operators, and memory management in these members and methods. These cause new rules in development. What is the Single Responsibility Principle in C++? The Single Responsibility Principle (SRP) is a computer programming principle that states “A module should be responsible to one, and only one, actor.” This principle exposes a rule for the classes in C++, called Rule of Zero. Now, let’s see what the Rule of Zero in C++ is. What is the Rule of Zero in C++? Rule of Zero means that, if all members have default member functions, no further work is needed. This is the simplest and cleanest semantics of programming. The compiler provides default implementations for all of the default member functions if there are no special member functions that are user-defined. In other words, you should prefer the case where no special member functions need to be defined. In this rule, classes that have custom destructors, copy/move constructors, or copy/move assignment operators should deal exclusively with ownership; other classes should not have custom destructors, copy/move constructors or copy/move assignment operators. Rule of Zero helps simplify our C++ code without risking resource management issues at run time. The term The Rule of Zero was coined by R. Martinho Fernandes in his paper in 2012. This paper is highly recommended reading to get the full details of this concept. The Rule of Zero rule can be seen in the C++ Core Guidelines here C.20: If you can avoid defining default operations, do. As in the example below, std::map and std::string have all the special functions, so you don’t need to create a constructor and destructor for them.   class Tmy_map {     public:       // … no default operations       private:       std::string title;       std::map<int, int> coords; };   Tmy_map m;       // default construct Tmy_map m2 {m};  // copy construct   How can we apply the Rule of Zero in C++? Here are some notes as to-dos in Rule of Zero. A simple empty C++ class is perfectly equivalent to default implementations (Rule of Five) in a class. A modern compiler is able to provide a default implementation, in example, this simple class. This class is exactly the same as the one below in modern C++.   class Tx { public:    Tx() = default;       Tx(Tx const& other) = default;    Tx& operator=(Tx const& other) = default;       Tx(Tx&& other) = default;    Tx& operator=(Tx&& other) = default;       ~Tx() = default; }   Use a std::unique_ptr if your class can be moved but should not […]

Read More

vcpkg is Now Included with Visual Studio

As of Visual Studio 2022 version 17.6, the vcpkg C/C++ package manager is included as an installable component for the C++ Desktop and C++ Gaming workloads. You can also find it in the installer by searching for vcpkg package manager under the Individual components tab. Using the Visual Studio Copy of vcpkg After you install or update Visual Studio with the vcpkg component checked, the package manager will be installed in your Visual Studio installation directory. You can run vcpkg commands directly from the Developer Command Prompt for Visual Studio or Developer PowerShell for Visual Studio. This also works for the equivalent consoles embedded in the IDE. vcpkg output is localized according to your Visual Studio language. Both ports and artifacts are supported. As with all copies of vcpkg, to initialize it with the IDE, you will first need to run vcpkg integrate install before running other commands. This will enable MSBuild and CMake IDE integration with this copy of vcpkg. You will need to run this command with administrator privileges. Importantly, the copy of vcpkg that ships with the IDE supports manifests but does not support classic mode. The reason for this is that classic mode requires write access to the vcpkg installation directory, but in this case it is in Program Files and the Visual Studio installer requires ownership of it. You can still use classic mode by running integrate install to an external copy of vcpkg instead. Recap: Existing vcpkg IDE Integration vcpkg was already supported by Visual Studio even before this update. Below is a recap of what you can do with the package manager in the IDE. In order to enable this functionality, you must have run vcpkg integrate install once in the past. Once that is done, you do not need to re-run this command. IntelliSense Support Code calling an external library installed with vcpkg will have working IntelliSense, including autocompletion, semantic colorization, code navigation, and refactoring features. MSBuild Integration There are several MSBuild properties for configuring vcpkg for your project. These are available under Configuration Properties > vcpkg. Importantly, you will want to set “Use Vcpkg Manifest” to “Yes” if you intend to use vcpkg in manifest mode with your MSBuild project. Once this is turned on, if you have a vcpkg.json file in your project, vcpkg will automatically be called every time you do a build to check if any dependencies need to be installed or updated. The package manager will then restore missing dependencies, allowing the build to proceed. CMake Integration The IDE automatically picks up the vcpkg.cmake toolchain file and passes it to the CMake command line behind the scenes, allowing you to use the CMake IDE experience seamlessly. Furthermore, if you have a vcpkg.json manifest file in your project, vcpkg will automatically run when CMake configures itself on project load or when the CMake cache is manually generated. The package manager will automatically install or update any missing dependencies, in accordance with the manifest file, allowing you to build your project successfully. Furthermore, CMake find_package() calls also have IntelliSense autocompletion for various libraries available via vcpkg. Environment Activation with vcpkg Artifacts If you have the Desktop development with C++ or Linux and embedded development workload installed in Visual Studio, you can automatically install and activate tools required for your […]

Read More

How To Use Gamepad Or Joystick Controller In A C++ Builder FMX App?

C++ is one of the most powerful programming languages that we can use to create games that are playable with mouse, keyboard and gamepads or joysticks. We also use C++ in commerce, industry, in robotics, and in the control of IoT devices. Despite competition from other programming languages the games market is still very much dominated by C++. Many games seek to go beyond keyboards to control the gameplay by using specialized controllers either in addition to or instead of keypresses on the computer’s keys. Two of the most well-known controllers in these areas are joysticks or gamepads. The simplest examples of interfacing with game controllers on Windows is by using the XInput library. Even though XInput has been around for a long time it can still be used with the latest C++ Editor and compiler for Windows. In this post, we explain how you can use gamepad or joystick controller in C++ using with Xinput library. Is there a component for using a gamepad or joystick in C++ on Windows? If you are looking for a component library, there are Delphi and C++ Builder-compatible components built on the XInput library. The Controller library is a Delphi and C++ Builder component that allows applications to receive input from the Xbox Controller. The main features of this library are: Uses Windows XInput API Available for Delphi and C++ Builder from versions 6 right up to the current modern version 11. Source code included in the registered version. Royalty-free distribution. You can download the trial version of the XInput library, or you can buy a professional edition from here. How can I control a gamepad or joystick in C++ with Xinput Library? XInput library is deprecated but is still a supported library by Microsoft. They recommend moving towards the GameInput library or Windows.Game.Input for Windows applications. If we look at these kinds of libraries (i.e GamePad.h library), like MS’ own DirectXTK, we can see that the toolkit allows one to define USING_XINPUT vs. USING_GAMEINPUT vs. USING_WINDOWS_GAMING_INPUT to pick which underlying library is used. If we compare  XInput compared to GameInput: XInput library is old and easy to implement Windows applications. XInput library is limited to 4 controllers XInput library has no uniform interface to other input (like mouse/keyboard) XInput library occurs with higher latency XInput library is not friendly with other controllers. i.e. no support for Xbox One Rumble Motors. Briefly, DirectInput is better than XInput. If you still want to use XInput, you can check more about https://learn.microsoft.com/en-us/windows/win32/xinput/getting-started-with-xinput XINPUT_GAMEPAD structure (declared in ) is explained here : https://learn.microsoft.com/en-us/windows/win32/api/xinput/ns-xinput-xinput_gamepad As in there, this structure has these members: wButtons, bLeftTrigger, bRightTrigger, sThumbLX, sThumbLY, sThumbRX, sThumbRY. Here wButtons member is used as a bitmask of the device digital buttons, it can be used as below, wButtons Device digital button flags Gamepad Bitmask XINPUT_GAMEPAD_DPAD_UP 0x0001 XINPUT_GAMEPAD_DPAD_DOWN 0x0002 XINPUT_GAMEPAD_DPAD_LEFT 0x0004 XINPUT_GAMEPAD_DPAD_RIGHT 0x0008 XINPUT_GAMEPAD_START 0x0010 XINPUT_GAMEPAD_BACK 0x0020 XINPUT_GAMEPAD_LEFT_THUMB 0x0040 XINPUT_GAMEPAD_RIGHT_THUMB 0x0080 XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100 XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200 XINPUT_GAMEPAD_A 0x1000 XINPUT_GAMEPAD_B 0x2000 XINPUT_GAMEPAD_X 0x4000 XINPUT_GAMEPAD_Y 0x8000 How to use a gamepad or joystick in a C++ Builder FMX application? Here are the steps to use gamepad or joystick in C++ Builder FMX app, Create a new Multi-Device C++ Builder FMX application Drag a Timer (TTimer) component on to Form In Object Inspector window, set its interval to 15 and be sure it is enabled Drag a shape Circle (TCircle) component on to Form In Object […]

Read More