How is a struct of struct's memory arranged by default in C++?

struct c++
struct in c
struct c#
typedef struct in c
struct vs class
initialize struct in c
struct definition
struct meaning

If I want to define a Matrix class in C++, for OpenGL rendering for example, the way I like to do it, and which also seems the most convenient, is to first define a Vector class as such :

class vec3 {
    double x;
    double y;
    double z;
    [ ... ]
}

class vec4 {
    double x;
    double y;
    double z;
    double w;
    [ ... ]
}

Now, as far as I understand, the values of x, y, z{, w} are supposed to be contiguous in memory when I create a vec{3|4} (right ???).

If I then create my matrix as such :

class mat3 {
    vec3 _m[3];
    [ ... ]
}

class mat4 {
    vec4 _m[4];
    [ ... ]
}

Would the values of x, y, z{, w} of each vector in the matrix class always be next to one another in memory ? If I give the adress of the first element to OpenGL, which reads the next 16 values in memory (for a 4x4 matrix), would it read the 16 values of the matrix in order, or could some other information from elsewhere in the program get in the way ?

Edit (29/Nov./2019) : Fixed a typo


Would the values of x, y, z{, w} of each vector in the matrix class always be next to one another in memory ?

Probably not guaranteed to be so by the language, but probably will be contiguous in practice.

would it read the 16 values of the matrix

The behaviour of indexing over members is undefined in C++. The API probably written in C which may have different rules through.

There is a data structure that you can iterate over and is guaranteed to have 16 adjacent elements: array of 16 doubles.

C - Structures, The struct statement defines a new data type, with more than one member. The format of You would use the keyword struct to define variables of structure type. A struct in the C programming language (and many derivatives) is a composite data type (or record) declaration that defines a physically grouped list of variables under one name in a block of memory, allowing the different variables to be accessed via a single pointer or by the struct declared name which returns the same address. The struct data type can contain other data types so is used for mixed-data-type records such as a hard-drive directory entry (file length, name, extension


The robust solution is to start with a double[16]. To the compiler, &vec3::y is just a way to express the offset of y, and you want that to be 1. You can achieve the same by writing

struct vec3 {
   double* base;
   double& x() { return *base; }
   double& y() { return *(base+1); }
   double& z() { return *(base+2); }
};
struct mat3 {
   double values[9];
   vec3 operator[](size_t s) { return vec3{values+3*s}; }
};

It's all inline, so the compiler can still calculate the offsets statically. There won't be a function call at runtime when you use y().

Struct in C#, This article explains Struct in C#. A structure is a value type that can contain constructors, constants, fields, methods, properties, indexers,� In C, you must explicitly use the struct keyword to declare a structure. In C++, you do not need to use the struct keyword after the type has been defined. You have the option of declaring variables when the structure type is defined by placing one or more comma-separated variable names between the closing brace and the semicolon.


The standard allows arbitrary padding, so technically whether the members are contiguous in memory is implementation-defined. I don't know of any implementation that does something unexpected for your case though, so you should be fine by just adding a static_assert(sizeof(vec3) == 3 * sizeof(double));.

Similarly, accessing a bunch of members as if they were an array (i.e. via pointer arithmetic) in your code is undefined behavior by the standard, as there is no actual array object there. Now, if you give OpenGL this struct which has the values in the right places there should be no problem (because your compiler presumably doesn't touch the OpenGL code and the OpenGL only cares that the bytes are what they should be).

But note that this is only "fine" for the scope of the course I would say. For actual production code, these assumptions are too flimsy and a more robust (but possibly slightly less convenient) approach should be preferred.

What is a C struct?, C struct, short for C Structure, is an user-defined data type available in C. It allows a user to combine data items of possibly different data types under a single name. C structs are different from arrays because arrays hold data of similar data-types only. Each element in the structure is called a member. A structure type (or struct type) is a value type that can encapsulate data and related functionality. You use the struct keyword to define a structure type: public struct Coords { public Coords(double x, double y) { X = x; Y = y; } public double X { get; } public double Y { get; } public override string ToString() => $"({X}, {Y})"; }


S.4.7 — Structs, A struct (short for structure) allows us to group variables of mixed data types together into a single unit. Declaring and defining structs. Because structs are user-� A static constructor is called automatically while initializing the struct when an instance is created. In the Main method, first, we create an object of struct ' Student ' as we did for class. In next line, we get the values of struct members with struct object followed by (.) and struct member name.


Struct declaration, A struct is a type consisting of a sequence of members whose storage is allocated in an ordered sequence (as opposed to union, which is a� In C++, a structure is the same as a class except for a few differences. The most important of them is security. A Structure is not secure and cannot hide its implementation details from the end user while a class is secure and can hide its programming and designing details. Learn more about the differences between Structures and Class in C++.


[PDF] Structs and Alignment, ❖ Why is placement of struct definition important? ▫ What actually happens when you declare a variable? • Creating space for it somewhere! ▫� struct is a tool for iOS and Mac developers to automate the creation and management of Xcode projects. Ever lamented over your unorganised project files? struct solves that by making your filesystem be your project structure. How it is on disk is how it is in your project.