Fortsätt till huvudinnehåll

Embedded development questions part I

Let me just hit you with this. Check this code:


const char* aChar_p = "Hello"; // (1) (2)
bool aBoolean; // (3)


int main()
{
  int i = 0; // (4)
  bool flag = true; // (5)


  return 0;
}


Now answer this. Where in memory will (1) be stored? What about (2), and (3), and (4), and (5)?
This was another question I was faced with during my recent job interview. To be honest, I have never needed to care much about linker files and memory layout. In every project I have been in these things have already been set up long before I've entered the scene. With that said, I think it's still good knowledge to have, so let's go trough them one by one.

  1. Variables defined at this (top) level are called global. They are accessible from anywhere in the code and has a lifespan that stretches over the entire program execution. You would say it is a static variable. Since the variable is static, you might think that adding the static keyword won't make any difference. This is however not correct, adding the static keyword to the declaration will limit the scope to the same source file. In most systems an initialized modifiable static variable is placed in the read-write data area of the data segment.
  2. As for (1) this data will be placed in the data area. However, since it is declared const it will probably be placed in a read-only section.
  3. Here we have an unitialized static variable. These are all placed in a special section of the data segment called .bss and their values are typically set to zero.
  4. This integer is a local initialized variable or automatic variable. Automatic variables, initialized or not, are almost for sure placed on the stack.
  5. See 4. The type of an automatic variable does not matter. It will be placed on the stack.
The guy who interviewed me claimed that both (1) and (3) would end up in .bss and that only (2) would end up in the data section. I believe that he was wrong and that (1) will be placed in the data section as well. What do you think?

Stay tuned for part II - find the bug(s).




Kommentarer

Populära inlägg i den här bloggen

Does TDD really improve software quality?

I have asked myself this question several times, and searched for answers, without coming up with any clear answer. Therefore I have decided to go hard core TDD for a longer period of time (at least 6 months) to really evaluate the effects. There are several things that I find confusing when it comes to TDD. One example is what actually defines a unit test. What is a "unit" anyway? After reading a bit about it I found a text claiming that the "unit" is "a unit of work", i.e. something quite small. Like converting a string to UPPERCASE or splitting a string into an ['a','r', 'r', 'a', 'y'] of chars. This work is usually performed by a single call to a single method in a single, isolated, class. So, what does it mean that a class is isolated? Does it mean that it doesn't have any dependencies to other classes? NO! In the context of TDD it means that any dependencies are supplied by the test environment, for exa...

Codility tasks - Part I

I was recently faced with two codility tasks when applying for a job as an Embedded Software Engineer. For those of you who arn't familiar with Codility you can check out their website here:  www.codility.com Task one - Dominator The first task was called Dominator. The goal was to, given a std::vector of integers, find an integer that occurs in more than half of the positions in the vector. If no dominator was found -1 should be returned. My approach was to loop through the vector from the first to the last element, using a std::map to count the number of occurences of each integer. If the count ever reached above half the size of the vector I stopped and returned that integer and if I reached the end without finding a dominator I returned -1. So was that a good approach? Well, the reviewer at the company rated the solution as 'pretty ok'. His preferred solution was store the first integer in the array and set a counter to 1. Then loop through the remaining i...

Some links to look more at

This post is a "note to self" to look more into these links: https://blog.idrsolutions.com/2013/09/5-tools-to-help-you-write-better-java-code/ https://blog.idrsolutions.com/2014/06/java-performance-tuning-tools/ I am looking for tools for static code- and performance analysis on Java code.