StudyLover
  • Home
  • Study Zone
  • Profiles
  • Typing Tutor
  • B Tree
  • Contact us
  • Sign in
StudyLover Advanced Looping Techniques in C ⚙️
Download
  1. C Programming
  2. Unit 2: Program Control Flow & Logic
C Programming: Loops / Iterative Statements 🔁 : Uses of the for Loop in C 🔄
Unit 2: Program Control Flow & Logic

Advanced looping in C involves exploiting the full flexibility of the language's syntax, writing code that is mindful of hardware performance, and understanding low-level control flow mechanisms.


Advanced Looping Techniques in C ⚙️

Mastering loops goes beyond basic repetition. It's about writing flexible, efficient code and understanding how loops interact with the underlying hardware and C's flexible syntax.

1. The Syntactic Flexibility of the for Loop

The three expressions in a for loop's header—initialization, condition, and modification—are all optional. This flexibility allows for powerful and concise idioms.

·         The Infinite Loop: The standard way to write an infinite loop in C.

C

for (;;) {

    // This will run forever until a 'break' or 'return' is hit.

}

·         Multiple Variables with the Comma Operator: The comma operator lets you manage multiple variables within the loop's header.

C

// Reversing a string in-place

for (int i = 0, j = len - 1; i < j; i++, j--) {

    char temp = str[i];

    str[i] = str[j];

    str[j] = temp;

}

·         Loop with a Null Body: All the work is done in the loop's header, and the body is just a null statement (;).

C

// Copying a string

char src[] = "hello", dest[6];

int i;

for (i = 0; (dest[i] = src[i]) != '\0'; i++);


size=2 width="100%" align=center>

2. Loops and Hardware Performance (Cache Locality)

Not all loops are created equal in terms of performance. How you access memory inside a loop can have a massive impact due to the CPU cache. Accessing memory sequentially is much faster than jumping around. This is called spatial locality.

In C, 2D arrays are stored in row-major order, meaning all elements of row 0 are contiguous, followed by all elements of row 1, and so on.

Example: 2D Array Traversal

C

#include <stdio.h>

#define ROWS 10000

#define COLS 10000

 
int matrix[ROWS][COLS];

 
void main() {

    // EFFICIENT: Row-major traversal

    // Accesses memory sequentially (matrix[0][0], matrix[0][1], ...),

    // resulting in high CPU cache hit rates. This is MUCH faster.

    for (int i = 0; i < ROWS; i++) {

        for (int j = 0; j < COLS; j++) {

            matrix[i][j] = 0;

        }

    }

 
    // INEFFICIENT: Column-major traversal

    // Jumps around in memory (matrix[0][0], matrix[1][0], ...),

    // causing frequent cache misses and drastically lower performance.

    for (int j = 0; j < COLS; j++) {

        for (int i = 0; i < ROWS; i++) {

            matrix[i][j] = 0;

        }

    }

}


size=2 width="100%" align=center>

3. Manual Optimization: Loop Unrolling

Loop unrolling is an optimization technique to reduce loop overhead (the cost of the increment and condition check) by performing the work of multiple iterations in a single pass.

·         Trade-offs:

o    Pro: Fewer branch instructions can improve performance on modern CPUs.

o    Con: Increases the size of the executable code.

Example

C

int sum = 0;

int arr[100];

 
// Standard loop

for (int i = 0; i < 100; i++) {

    sum += arr[i];

}

 
// Manually unrolled loop (by a factor of 4)

// Assumes the array size is a multiple of 4

for (int i = 0; i < 100; i += 4) {

    sum += arr[i];

    sum += arr[i+1];

    sum += arr[i+2];

    sum += arr[i+3];

}

Note: Modern compilers are often very good at unrolling loops automatically when optimization flags (-O2, -O3) are used.


4. Duff's Device: The Ultimate switch/do-while Loop

This is a famous (and infamous) C technique that demonstrates the true nature of case labels as simple jump targets. It's an extreme form of loop unrolling that interleaves a do-while loop with a switch statement to efficiently copy a specific number of bytes.

This is an advanced, non-intuitive construct shown for educational purposes and is not recommended for general use.

Example

C

void send(int *to, int *from, int count) {

    int n = (count + 7) / 8; // Process in chunks of 8

    switch (count % 8) {

        case 0: do { *to++ = *from++;

        case 7:      *to++ = *from++;

        case 6:      *to++ = *from++;

        case 5:      *to++ = *from++;

        case 4:      *to++ = *from++;

        case 3:      *to++ = *from++;

        case 2:      *to++ = *from++;

        case 1:      *to++ = *from++;

                } while (--n > 0);

    }

}

How it works: The switch statement is used to jump into the middle of the unrolled do-while loop for the first partial chunk. Subsequent full chunks are handled by the complete do-while loop.

 

C Programming: Loops / Iterative Statements 🔁 Uses of the for Loop in C 🔄
Our Products & Services
  • Home
Connect with us
  • Contact us
  • +91 82955 87844
  • Rk6yadav@gmail.com

StudyLover - About us

The Best knowledge for Best people.

Copyright © StudyLover
Powered by Odoo - Create a free website