Types, memory and how learning a lower-level language can make you a better programmer
this keyword. It’s much easier to know features like these than to understand them.
“Any fool can know. The point is to understand.” — Albert Einstein
Indeed, even though this behaviour is — ultimately — predictable, certain automatic decisions are less-than-intuitive, and in a large codebase, it’s easy to see how type coercion could lead to unexpected errors. For example, here are a few demonstrations of the results achieved using equations that combine strings and numbers:
In these examples, a lot of the potential confusion revolves around the
+ operator, which can be used to both coerce a string to a number and — as the concatenation operator — to combine two or more strings.
Types and Memory Management in C++
const — for the declaration of new variables, in C++ every data type has its own keyword.
So, for example, the 7 basic data types in C++ are integer, floating point, double floating point, character, wide character, boolean, and valueless. The keywords used to define them are
The following snippet contains a sample declaration of each of these types, with additional notes in the comments:
char usually contains just 8 bits (1 byte), limiting its use to the 255 characters of the ISO Latin tables. By contrast, a
wchar_t contains 16 or 32 bits, taking up more memory but allowing us to access the much larger variety of Unicode characters.
The greatest variety of options is found in the integer type, where the basic
int keyword can be combined with the size keywords
long long and the “signedness” keywords
int type contains the natural size suggested by the system architecture. On a 64-bit operating system, that is usually a size of 32 bits. In practice, that means such a signed variable can contain values varying between -2,147,483,648 and 2,147,483,647, while an unsigned variable can contain values between 0 and 4,294,967,295.
If you know the range of possible integers is smaller than that, you can use a
short int to save memory. Or, if you’re dealing with extremely large integers, you can use a
unsigned long long int to write 64-bit numbers as large as
2^64-1 (9 quintillion).
Why Memory Matters: A Use-Case About the End of Time
Using a 64-bit variable declaration such as
long long int allows computers to measure dates some 292 million years into the future. This may seem like a needlessly large amount of time, but it actually solves a very practical problem.
By convention, most dates in computing are measured using Unix time, which is dated from midnight on 1 January 1970 UTC and which is accurate to the nearest second. On systems where Unix time is stored as a signed 32-bit number, the largest value that can be recorded is 2,147,483,647. This might seem large, but given we’re recording every single second, two billion actually doesn’t get us very far.
In fact, dates recorded on 32-bit systems will reach their maximum value on 19 January 2038 UTC (at exactly 03:14:07). When that happens, the date will wrap around to negative 2,147,483,647, appearing as 13 December 1901. This is known as the 2038 Problem, and it has lead to many hyperbolic headlines, such as “All computers are going to be wiped out in 2038” — courtesy of the Metro, a tabloid in the UK.
The 2038 Problem demonstrates the potential usefulness of managing memory ourselves. Where we require a smaller range of values, we can save memory. And where we require a larger range, we can make sure our system stores an adequate amount.
Garbage collection is a powerful system for automatic memory management, but it’s not foolproof. In particular, so-called “unwanted references” can lead to memory leaks, meaning that a program takes up more memory than is necessary, making it less efficient. However, if we are aware of the risk of memory leaks, we can take steps to remove them.
const, then that is automatically considered to be a global variable. Unless
foo is already defined, the expression
foo = "bar" is equivalent to
window.foo = "bar" .
"use strict"; at the beginning of any script or function where you want to use it. For more ways to remove memory leaks from your code, check out this article.
There are lots of great resources out there on TypeScript, suffice to say that it is a great way to ensure that your code is scalable and error-free, and it will help us avoid the kind of unintuitive results we saw above, in the section on “type coercion”. The file extension of TypeScript is
.ts and there is also an equivalent for
.tsx . One of the best starting points for beginners is TypeScript in 5 Minutes.