所以我一直在看一下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) 我使用着名的(优秀的)iOS Universal Framework Xcode模板创建了一个iOS框架项目.
但是现在我遇到了一个令人讨厌的问题,我似乎无法解决这个问题,即我有一个引用框架项目的iOS应用程序项目,当我运行它并在框架中设置断点时它们无法得到它.似乎GDB没有框架的调试符号.
我确保调试符号不会从框架中删除,并且类型设置为"DWARF with dSYM file".
任何人有任何想法可能是错的,以及如何解决它?
我的设置:
我在配置为使用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的其他类中.不确定这是否相关.
非常感谢您的帮助.
我收到这个错误......任何想法如何解决?
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开发者的配置文件,我能够生成(.ipa)上传到testflightapp.但是它在testflight中给出了一个错误"它是无效的(.ipa)"是因为我使用的是开发人员配置文件而不是分发配置文件?
我试图用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) 让我跳过介绍并跳到好的部分.我正在阅读"道德黑客手册"并尝试一些示例代码(约为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笔记本电脑上编译并运行它,那么结果就像预期的那样.
##> 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) 我已经将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)
我可以安全地进入这些文件并删除参考文献,还是有一种更清洁的方法来摆脱那些旧的瑕疵?
请考虑以下代码:
@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) 请考虑以下代码:
#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)