小编mat*_*way的帖子

编译器如何很好地优化这个阶乘函数?

所以我一直在看一下O3GCC 中的一些魔法(实际上我正在使用Clang进行编译,但它与GCC相同,我猜测优化器的很大一部分是从GCC转到Clang) .

考虑这个C程序:

int foo(int n) {
    if (n == 0) return 1;
    return n * foo(n-1);
}

int main() {
    return foo(10);
}
Run Code Online (Sandbox Code Playgroud)

我在WOW-ed中遇到的第一件事(在这个问题中也是如此 - /sf/answers/29034211/)是int foo(int)(一个基本的阶乘函数)如何编译成一个紧凑的循环.这是它的ARM程序集:

    .globl  _foo
    .align  2
    .code   16
    .thumb_func _foo
_foo:
    mov r1, r0
    movs    r0, #1
    cbz r1, LBB0_2
LBB0_1:
    muls    r0, r1, r0
    subs    r1, #1
    bne LBB0_1
LBB0_2:
    bx  lr
Run Code Online (Sandbox Code Playgroud)

Blimey我想.这很有趣!完全紧密循环来做阶乘.哇.这不是尾调用优化,因为它不是尾调用.但它似乎做了类似的优化.

现在看看main:

    .globl  _main
    .align  2
    .code   16
    .thumb_func _main
_main:
    movw    r0, …
Run Code Online (Sandbox Code Playgroud)

gcc clang compiler-optimization

14
推荐指数
1
解决办法
820
查看次数

iOS框架项目断点不起作用

我使用着名的(优秀的)iOS Universal Framework Xcode模板创建了一个iOS框架项目.

但是现在我遇到了一个令人讨厌的问题,我似乎无法解决这个问题,即我有一个引用框架项目的iOS应用程序项目,当我运行它并在框架中设置断点时它们无法得到它.似乎GDB没有框架的调试符号.

我确保调试符号不会从框架中删除,并且类型设置为"DWARF with dSYM file".

任何人有任何想法可能是错的,以及如何解决它?

我的设置:

  • Xcode 4.2.1
  • iOS SDK 5.0

ios xcode4

12
推荐指数
2
解决办法
3867
查看次数

ARC内存泄漏

我在配置为使用ARC的项目中遇到与NSMutableArray链接的内存泄漏,我认为应该为您处理这些事情.

以下代码触发NSNumbers的泄漏:

NSMutableArray *myArray = [[NSMutableArray alloc] init];

NSNumber  *myNumber = [NSNumber numberWithFloat:10];

[myArray addObject:myNumber];
Run Code Online (Sandbox Code Playgroud)

运行最后一行在调试器中给出以下内容:

objc [1106]:类__NSCFNumber的对象0x765ffe0自动释放,没有池到位 - 只是泄漏 - 在objc_autoreleaseNoPool()中断以调试

除此之外,对象似乎正确地添加到可变数组中,

我做错了什么吗?

注意:项目中有一个类无法使用ARC,因此我使用编译器标志-fno-objc-arc将其从ARC中排除.但是,泄漏发生在使用ARC的其他类中.不确定这是否相关.

非常感谢您的帮助.

xcode ios automatic-ref-counting

12
推荐指数
1
解决办法
1万
查看次数

无法打开可执行文件 - xcode

我收到这个错误......任何想法如何解决?

GenerateDSYMFile /Users/fmota/Library/Developer/Xcode/DerivedData/PBTest-gvudadeakgzklbekugyiqyfyprlt/Build/Products/Debug-iphonesimulator/PBTest.app.dSYM /Users/fmota/Library/Developer/Xcode/DerivedData/PBTest-gvudadeakgzklbekugyiqyfyprlt/Build/Products/Debug-iphonesimulator/PBTest.app/PBTest
    cd /Users/fmota/Documents/Developer/Protobuf/PBTest
    setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Developer/usr/bin/dsymutil /Users/fmota/Library/Developer/Xcode/DerivedData/PBTest-gvudadeakgzklbekugyiqyfyprlt/Build/Products/Debug-iphonesimulator/PBTest.app/PBTest -o /Users/fmota/Library/Developer/Xcode/DerivedData/PBTest-gvudadeakgzklbekugyiqyfyprlt/Build/Products/Debug-iphonesimulator/PBTest.app.dSYM

error: unable to open executable '/Users/fmota/Library/Developer/Xcode/DerivedData/PBTest-gvudadeakgzklbekugyiqyfyprlt/Build/Products/Debug-iphonesimulator/PBTest.app/PBTest'
Run Code Online (Sandbox Code Playgroud)

iphone xcode objective-c ios xcode4

11
推荐指数
1
解决办法
1万
查看次数

我们可以使用开发人员配置文件上传(.ipa)到testflight吗?

我想知道,通过iphone开发者的配置文件,我能够生成(.ipa)上传到testflightapp.但是它在testflight中给出了一个错误"它是无效的(.ipa)"是因为我使用的是开发人员配置文件而不是分发配置文件?

iphone ios testflight ios-provisioning

11
推荐指数
1
解决办法
8113
查看次数

如何在SwiftUI的列表中启用选择

我试图用SwiftUI创建一个简单的多选列表。我无法使其工作。

列表有第二个参数,它是SelectionManager,所以我尝试创建一个具体的实现。但是,它永远不会被调用,行也不会突出显示。

import SwiftUI

var demoData = ["Phil Swanson", "Karen Gibbons", "Grant Kilman", "Wanda Green"]

struct SelectKeeper : SelectionManager{
    var selections = Set<UUID>()

    mutating func select(_ value: UUID) {
        selections.insert(value)
    }

    mutating func deselect(_ value: UUID) {
        selections.remove(value)
    }

    func isSelected(_ value: UUID) -> Bool {
        return selections.contains(value)
    }

    typealias SelectionValue = UUID

}

struct SelectionDemo : View {
    @State var selectKeeper = SelectKeeper()

    var body: some View {
        NavigationView {
            List(demoData.identified(by: \.self)){ name in
                Text(name)
            }
                .navigationBarTitle(Text("Selection Demo"))
        } …
Run Code Online (Sandbox Code Playgroud)

list selection swiftui

11
推荐指数
3
解决办法
3856
查看次数

堆栈eip溢出x86 vs x86_64 easy C代码

让我跳过介绍并跳到好的部分.我正在阅读"道德黑客手册"并尝试一些示例代码(约为p175).

-------------------------------------------------- ---------------------------------------

目标:溢出堆栈中的EIP

示例代码:

##> cat overflow.c
main(){
    char str1[10];   // declare a 10byte string
    // next, copy 35 bytes of 'A' to 'str1'
    strcpy(str1,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
}
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------------- ---------------------------------------

如果我在我的x86笔记本电脑上编译并运行它,那么结果就像预期的那样.

使用openSuse 12.1在X86上生成结果

##> uname -a
Linux linux-tzxm.site 3.1.0-1.2-desktop #1 SMP PREEMPT 
Thu Nov 3 14:45:45 UTC 2011 (187dde0) i686 i686 i386 GNU/Linux

##> cat /proc/sys/kernel/randomize_va_space 
1

##> gcc version 4.6.2 (SUSE Linux)
##> GNU gdb (GDB) SUSE (7.3-41.1.2)

##> gdb -q overflow

Reading symbols from /home/administrator/Programming/C/testProgs/overflow...done.

(gdb) run

Starting program: …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly stack x86-64

10
推荐指数
1
解决办法
7727
查看次数

如何在SVN - > Git迁移后彻底清理?

我已经将SVN的回购迁移到Git svn2git,除了一件事之外我对所有事情感到满意.如何删除remotes/svn/trunk显示在git branch -a以下位置的分支:

$ git branch -a
* master
  remotes/origin/master
  remotes/svn/trunk
Run Code Online (Sandbox Code Playgroud)

svn2git通过执行以下操作后我清理了一下:

git config --remove-section svn-remote.svn
git config --remove-section svn
rm -rf .git/svn
Run Code Online (Sandbox Code Playgroud)

但我仍然remotes/svn/trunk坐在那里!我得到这个,如果我grep .git目录svn:

$ grep -R svn .git
.git/info/refs:e6dd7a08d86d9b0944891755602b25ce12d30bb0 refs/remotes/svn/trunk
Binary file .git/objects/pack/pack-10cdd522d8f0fcc9b30efeddbdad3d0281c1e6da.pack matches
.git/packed-refs:e6dd7a08d86d9b0944891755602b25ce12d30bb0 refs/remotes/svn/trunk
Run Code Online (Sandbox Code Playgroud)

我可以安全地进入这些文件并删除参考文献,还是有一种更清洁的方法来摆脱那些旧的瑕疵?

git git-svn

10
推荐指数
1
解决办法
4781
查看次数

iOS:Block属性在访问时直接设置崩溃

请考虑以下代码:

@interface ClassA : NSObject
@property (nonatomic, copy) void(^blockCopy)();
@end

@implementation ClassA

@synthesize blockCopy;

- (void)giveBlock:(void(^)())inBlock {
    blockCopy = inBlock;
}

@end
Run Code Online (Sandbox Code Playgroud)

然后使用它具有一个类strong类型的属性ClassA称为someA:

self.someA = [[ClassA alloc] init];
[self.someA giveBlock:^{
    NSLog(@"self = %@", self);
}];
dispatch_async(dispatch_get_main_queue(), ^{
    self.someA.blockCopy();
    self.someA = nil;
});
Run Code Online (Sandbox Code Playgroud)

如果我运行在O3启用ARC的情况下运行,在iOS上,它会在self.someA.blockCopy();内部调用期间崩溃objc_retain.为什么?

现在我意识到人们可能会说我应该设置它self.blockCopy = inBlock但我确实认为ARC应该在这里做正确的事情.如果我查看从该giveBlock:方法生成的程序集(ARMv7),它看起来像这样:

        .align  2
        .code   16
        .thumb_func     "-[ClassA giveBlock:]"
"-[ClassA giveBlock:]":
        push    {r7, lr}
        movw    r1, :lower16:(_OBJC_IVAR_$_ClassA.blockCopy-(LPC0_0+4))
        mov     r7, sp …
Run Code Online (Sandbox Code Playgroud)

objective-c clang ios automatic-ref-counting

9
推荐指数
1
解决办法
3659
查看次数

Objective-C对象typedef产生奇怪的@encode并打破KVC

请考虑以下代码:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

typedef NSString* MyStringRef;
typedef NSString MyString;

@interface ClassA : NSObject
@property (nonatomic, copy) MyStringRef stringA;
@property (nonatomic, copy) MyString *stringB;
@end

@implementation ClassA
@synthesize stringA = _stringA;
@synthesize stringB = _stringB;
@end

int main() {
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([ClassA class], &count);
    for (unsigned int i = 0; i < count; i++) {
        Ivar thisIvar = ivars[i];
        NSLog(@"thisIvar = %s, %s", ivar_getName(thisIvar), ivar_getTypeEncoding(thisIvar));
    }

    ClassA *a = [[ClassA alloc] init];
    NSLog(@"Out: …
Run Code Online (Sandbox Code Playgroud)

typedef objective-c

8
推荐指数
1
解决办法
469
查看次数